python图像常规操作


Posted in Python onNovember 11, 2017

使用python进行基本的图像操作与处理

前言:

与早期计算机视觉领域多数程序都是由 C/C++ 写就的情形不同。随着计算机硬件速度越来越快,研究者在考虑选择实现算法语言的时候会更多地考虑编写代码的效率和易用性,而不是像早年那样把算法的执行效率放在首位。这直接导致近年来越来越多的研究者选择 Python 来实现算法。

今天在计算机视觉领域,越来越多的研究者使用 Python 开展研究,所以有必要去学习一下十分易用的python在图像处理领域的使用,这篇博客将会介绍如何使用Python的几个著名的图像处理库完成最基本的图像操作与处理。

使用PIL进行基本图像操作

PIL简介:

PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。

PIL读取与存储图像:

利用 PIL 中的函数,我们可以从大多数图像格式的文件中读取数据,然后写入最常见的图像格式文件中。PIL 中最重要的模块为 Image 。

下面这个程序我使用PIL读取一张jpg图片将其灰度化之后存为一个png文件:

# -*- coding: utf-8 -*-
from PIL import Image
import os
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
#将其转为一张灰度图
img = img.convert('L')
#存储该张图片
try:
  img.save("test.png")
except IOError:
  print "cannot convert"

Test.jpg

python图像常规操作

Test.png

python图像常规操作

PIL生成缩略图:

# -*- coding: utf-8 -*-
from PIL import Image
import os
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
#创建最长边为128的缩略图
img.thumbnail((128,128))
#存储该张图片
try:
  img.save("test.png")
except IOError:
  print "cannot convert"

Test.png

python图像常规操作

PIL调整尺寸与旋转:

# -*- coding: utf-8 -*-
from PIL import Image
import os
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
#修改图片大小,参数为一元组
img = img.resize((100,200))
#使图片逆时针选择45度
img = img.rotate(45)
#存储该张图片
try:
  img.save("test.png")
except IOError:
  print "cannot convert"

Test.png

python图像常规操作

PIL复制粘贴图像区域:

# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
from PIL import Image
import os
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
#从img中裁剪指定区域
region = img.crop((300,300,500,500))
#使裁剪部分逆时针选择145度
region = region.rotate(145)
#将该区域粘贴至指定区域
img.paste(region,(100,100,300,300));
#存储该张图片
try:
  img.save("test.png")
except IOError:
  print "cannot convert"

Test.png

python图像常规操作

元组的使用中,坐标原点为左上角,区域划分如下图所示

python图像常规操作

使用Matplotlib进行基本图像操作

Matplotlib简介:

我们处理数学运算、绘制图表,或者在图像上绘制点、直线和曲线时, Matplotlib是个很好的类库,具有比 PIL 更强大的绘图功能。Matplotlib 可以绘制出较好的条形图、饼状图、散点图等,但是对于大多数计算机视觉应用来说,仅仅需要用到几个绘图命令。比如,我们想用点和线来表示一些事物,比如兴趣点、对应点以及检测出的物体。

使用Matplotlib绘制图像、点、线

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
#打开图像得到一个PIL图像对象
img = Image.open("./source/test.jpg")
# 读取图像到数组中
im = array(img)
# 绘制图像
imshow(im)
# 一些点
x = [100,100,400,400]
y = [200,500,200,500]
# 使用红色星状标记绘制点
plot(x,y,'r*')
# 绘制连接前两个点的线
plot(x[:2],y[:2])
# 添加标题,显示绘制的图像
title('Plotting: "Test.jpg"')
show()

show() 命令首先打开图形用户界面(GUI),然后新建一个图像窗口。该图形用户界面会循环阻断脚本,然后暂停,直到最后一个图像窗口关闭。在每个脚本里,你只能调用一次 show() 命令,而且通常是在脚本的结尾调用。

也可以使用axis(‘off')命令使坐标轴不显示。

运行结果

python图像常规操作

在绘图时,有很多选项可以控制图像的颜色和样式。

如:

plot(x,y)      #默认为蓝色实线
plot(x,y,'r*')   #红色星状标记
plot(x,y,'go-')   #带有圆圈标记的绿线
plot(x,y,'ks:')   #带有正方形标记的黑色虚线

标记 颜色
‘b' 蓝色
‘g' 绿色
‘r' 红色
‘c' 青色
‘m' 品红
‘y' 黄色
‘k' 黑色
‘w' 白色

标记 线型
‘-‘ 实线
‘?' 虚线
‘:' 点线

标记 形状
‘.'
‘o' 圆圈
's' 正方形
‘*' 星形
‘+' 加号
‘x' 叉号

使用Matplotlib绘制图像轮廓

绘制图像的轮廓(或者其他二维函数的等轮廓线)在工作中非常有用。因为绘制轮廓需要对每个坐标 [x, y] 的像素值施加同一个阈值,所以首先需要将图像灰度化,之后使用contour获得轮廓图像

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 读取图像到数组中,并灰度化
im = array(Image.open('./source/test.jpg').convert('L'))
#显示时抛弃颜色信息
gray()
# 显示轮廓图像
contour(im, origin='image')
# 在原点的左上角显示
axis('equal')
#关闭坐标轴
axis('off')
show()

运行结果

python图像常规操作

使用Matplotlib绘制直方图

图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。(灰度)图像的直方图可以使用 hist() 函数绘制:

hist() 函数的第二个参数指定小区间的数目。需要注意的是,因为 hist() 只接受一维数组作为输入,所以我们在绘制图像直方图之前,必须先对图像进行压平处理。flatten() 方法将任意数组按照行优先准则转换成一维数组。

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 读取图像到数组中,并灰度化
im = array(Image.open('./source/test.jpg').convert('L'))
# 直方图图像
hist(im.flatten(),128)
# 显示
show()

运行结果

python图像常规操作

使用Matplotlib进行交互式标注

PyLab 库中的 ginput() 函数可以实现交互式标注,用来标记一些点或者是一些训练数据。

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 读取图像到数组中
im = array(Image.open('./source/test.jpg'))
# 显示图像
imshow(im)
print 'Please click 3 points'
#获取点击并将点击坐标保存在[x,y]列表中
x = ginput(3)
#输出保存的数据
print 'you clicked:',x
show()

上面的脚本首先绘制一幅图像,然后等待用户在绘图窗口的图像区域点击三次。程 序将这些点击的坐标 [x, y] 自动保存在 x 列表里。

运行结果

you clicked: [(295.22704081632651, 210.72448979591837), (405.43112244897952, 66.846938775510239), (439.1045918367347, 180.11224489795921)]

总结

本篇博客介绍了一些python基本的图像操作,除了上述的PIL和Matplotlib,还经常会使用numpy直接操作图像数组来达到操作图像的目的,使用scipy完成更多更复杂的计算,我会把我的学习过程记录下来,希望对大家有所帮助~

以上就是本文关于python图像常规操作的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

Python 相关文章推荐
python处理html转义字符的方法详解
Jul 01 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
Python提取特定时间段内数据的方法实例
Apr 01 Python
linux环境下Django的安装配置详解
Jul 22 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
Tensorflow 多线程与多进程数据加载实例
Feb 05 Python
Python Numpy 控制台完全输出ndarray的实现
Feb 19 Python
python2 对excel表格操作完整示例
Feb 23 Python
基于FME使用Python过程图解
May 13 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
python使用ctypes库调用DLL动态链接库
Oct 22 Python
python中实现k-means聚类算法详解
Nov 11 #Python
Python编程之基于概率论的分类方法:朴素贝叶斯
Nov 11 #Python
Python内存管理方式和垃圾回收算法解析
Nov 11 #Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 #Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 #Python
python基础练习之几个简单的游戏
Nov 10 #Python
Python实现购物车功能的方法分析
Nov 10 #Python
You might like
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
destoon二次开发入门示例
2014/06/20 PHP
php计算年龄精准到年月日
2015/11/17 PHP
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
jquery设置控件位置的方法
2013/08/21 Javascript
BAT及各大互联网公司2014前端笔试面试题--JavaScript篇
2014/10/29 Javascript
详解JavaScript的表达式与运算符
2015/11/30 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
2016/09/17 Javascript
Javascript实现时间倒计时效果
2017/07/15 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
微信分享invalid signature签名错误踩过的坑
2020/04/11 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
JS实现简易日历效果
2021/01/25 Javascript
Python 返回汉字的汉语拼音
2009/02/27 Python
Python实现统计单词出现的个数
2015/05/28 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
深入理解Tensorflow中的masking和padding
2020/02/24 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
SQL Server提供的3种恢复模型都是什么? 有什么区别?
2012/05/13 面试题
三年级语文教学反思
2014/02/01 职场文书
劳动竞赛口号
2014/06/16 职场文书
小学音乐课教学反思
2016/02/18 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
SpringBoot 集成Redis 过程
2021/06/02 Redis