天天看点

python基本图像操作Python基本图像操作

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

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

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

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

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

test.jpg

python基本图像操作Python基本图像操作

test.png

python基本图像操作Python基本图像操作
python基本图像操作Python基本图像操作
python基本图像操作Python基本图像操作
python基本图像操作Python基本图像操作

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

python基本图像操作Python基本图像操作

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

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

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

运行结果

python基本图像操作Python基本图像操作

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

如:

标记

颜色

‘b’

蓝色

‘g’

绿色

‘r’

红色

‘c’

青色

‘m’

品红

‘y’

黄色

‘k’

黑色

‘w’

白色

线型

‘-‘

实线

‘–’

虚线

‘:’

点线

形状

‘.’

‘o’

圆圈

’s’

正方形

‘*’

星形

‘+’

加号

‘x’

叉号

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

python基本图像操作Python基本图像操作

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

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

python基本图像操作Python基本图像操作

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

上面的脚本首先绘制一幅图像,然后等待用户在绘图窗口的图像区域点击三次。程

序将这些点击的坐标 [x, y] 自动保存在 x 列表里。

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

继续阅读