前言
学习过flask动画制作或者视频编辑的童鞋应该都知道,我们平时所看到的流畅的视频画面都是由一帧一帧的图像构成的,比如我们以前读书的时候喜欢在书的边角处花一些动作不同的简笔画,当我们快速翻动书本的时候就好像我们的简笔画中的物体活了,就像在看动画一般.所以当我们需要对一个视频文件进行分析时,连续播放的视频并没有那么容易进行采样分析,在计算机视觉中对视频的分析通常都是对视频帧的分析.说白了,其实计算机视觉就是一们研究如何对图像中的信息进行自动提取的学科.
所以学习计算机视觉首先需要学会如何对图像进行处理,那在Python中我们都怎么处理图像的呢?
在Python中处理图像的库有很多,非常丰富,Python的火热也正是得益于此,得益于社区的完善和活跃.这里我们选择常用的PIL图像处理库,它提供了我们通常使用的各种图像处理功能,比如:裁剪,旋转,缩放,颜色转换,模糊等等.其实PIL官方版本是以Python2.X的版本发行的,并没有针对Python3.X的PIL版本,我们在Python3中使用的Pillow库.是一群社区的志愿者在PIL的基础上建立的兼容版本,而且还在原来的基础上增加了其他新的功能.
准备
我们处理图像一般用到的库如下:
pillow,numpy,matplotlib等
安装这些库很简单,这里推荐使用anaconda集成管理工具来进行安装相关的库,anaconda中包含了多个常用于科学计算的库,如果使用命令安装可使用如下命令:
pip3 install pillowpip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple如果你的pip不是最新版本的可使用以下命令更新升级,以免造成安装失败
python -m pip install --upgrade pip接下来我们小试牛刀,看看PIL是如何处理图像的
浅尝图像处理
我们先从找一张测试用的图:
from PIL import Imageimport matplotlib.pylab as pltimg1 = Image.open('t1.jpg') #打开图像img2 = img1.convert('L') #将图像转化成灰度图img2.resize((128,128)) #调整图片大小plt.subplot(2,1,1)plt.imshow(img1)plt.subplot(2,1,2)plt.imshow(img2)plt.show()执行结果:
这个程序我们使用PIL库结合matplotlib库对图像进行灰度转换,并在将其绘制到坐标上
PIL库中比较重要的模块就是Image,它包含了图像的读取,保存等函数,比如我们以上的代码中.open(),顾名思议.就是打开图像,就跟文件处理.我们想要操作文件,修改文件的内容首先是打开并读取到文件原有的内容,能进行后续的处理.接着使用convert()函数将图像转换成灰度图,因为在很多时候,图像本身的颜色会对我们要分析的信息造成干扰,而灰度图可以帮助我们更好地分析问题.接着我们使用matplotlib中subplot将多张图绘制到用户界面.
绘制图像的直方图
很多时候我们对一个图像进行分析的时候,图像的像素通常是一个很好的着手点.而图像的直方图则可以比较直观地展示图像的像素分布.通过绘制图像的直方图,可以进行图像检索,图像分割,图像分类......图像的直方图和数学中的直方图类似,将像素值范围划分成一定数目的小区间,每个小区间内就是落在该区间表示范围内的像素数目,用这种形式来呈现图像颜色的分布情况.
我们还是使用上面例子那种图:
from PIL import Imagefrom pylab import *import numpy as npimg1=np.array(Image.open('t1.jpg').convert('L'))figure()hist(img1.flatten(),128)show()执行结果:
这里使用numpy的array()函数将图像转化为一个数组对象,用三元组表示像素点(行,列,颜色通道),直方图绘制使用hits()函数.函数的第一参数是输入的图像,第二个参数指定划分的小区间的数目.hits()函数只能输入一维数组.所以需要对输入的图像做一些转换.这里我们用到了flatten()函数先将数组按照行优先原则转化成一维数组,再利用hits()绘制图像.
总结
本文我们了解到图像分析的基本流程和图像处理相关的库以及库的操作.计算机视觉中对与图像的操作远不止如此,本文只是浅尝辄止,比如常用的还有旋转,去噪,模糊,扭曲等等,在普通的验证的识别中,经常需要对验证码图片进行去噪处理,排除图像中无关的干扰素,让识别结果更加准确.除此之外,我们还可以结合更多其它的图像处理库,做出更好玩的东西.比如我之前写的使用opencv进行人的脸检测和识别