本文使用Python的一些工具包(PIL、Matplotlib、Numpy以及SciPy)进行了简单的图像处理。下面会简单介绍这些工具包的功能及示例。
PIL(Python Imaging Library)提供了通用的图像处理功能,以及大量有用的基本图像操作,如图像缩放、旋转、裁剪、颜色转换等。(PIL的下载地址:http://www.pythonware.com/products/pil/)
下面的例子是用PIL库实现将一张彩色图像转成灰度图像、复制图像并进行旋转变换再拷贝到原来的图像上、调整图像尺寸及旋转等基本的图像处理操作。
from PIL import Image
from pylab import *
# 显示原图
pil_im = Image.open('../Pictures/04.jpg')
subplot(231)
title('original image')
axis('off') #不显示图像的坐标轴
imshow(pil_im)
# 显示灰度图
pil_im = Image.open('../Pictures/04.jpg').convert('L')
gray()
subplot(232)
title('gray image')
axis('off')
imshow(pil_im)
#拷贝粘贴区域
pil_im = Image.open('../Pictures/04.jpg')
box = (100,100,400,400)
region = pil_im.crop(box) #将图像拷贝到指定区域
region = region.transpose(Image.ROTATE_180) #对图像进行旋转变换
pil_im.paste(region,box)
subplot(233)
title('copy image')
axis('off')
imshow(pil_im)
# 缩略图
pil_im = Image.open('../Pictures/04.jpg')
size = 32,64
pil_im.thumbnail(size) #将图像缩成指定大小
subplot(234)
title('thumbnail image')
axis('off')
imshow(pil_im)
pil_im.save('../Pictures/05.jpg') #保存缩略图
# 调整图像尺寸
pil_im = Image.open('../Pictures/04.jpg')
pil_im = pil_im.resize(size)
subplot(235)
title('resize image')
axis('off')
imshow(pil_im)
# 旋转图像45°
pil_im = Image.open('../Pictures/04.jpg')
pil_im = pil_im.rotate(45)
subplot(236)
title('rotate 45°')
axis('off')
imshow(pil_im)
show()
当在处理数学及绘图或在图像上描点、画直线、曲线时,Matplotlib是一个很好的绘图库,具有比PIL更强大的绘图功能。Matplotlib中的PyLab接口包含很多方便用户创建图像的函数。(Matplotlib的下载地址: http://matplotlib.sourceforge.net/)
下面是用Matplotlib库绘制出图像的轮廓和直方图。
from PIL import Image
from pylab import *
figure()
subplot(121)
im = array(Image.open('../Pictures/04.jpg').convert('L'))
gray()
contour(im, origin='image')
axis('equal')
axis('off')
title('image edge')
subplot(122)
hist(im.flatten(), 128)
plt.xlim([0,260])
plt.ylim([0,11000])
show()
NumPy是Python一个流行的用于科学计算包。它包含了很多诸如矢量、矩阵、图像等其他非常有用的对象和线性代数函数。NumPy中的数组对象可以帮助你实现数组中重要操作,如矩阵乘积、转置、向量乘积和归一化等。(NumPy的下载地址:http://www.scipy.org/Download)
在前面载入图像的示例中,我们将图像用array()函数转为NumPy数组对象,但是并没有提到它表示的含义。数组就像列表一样,只不过它规定了数组中的所有元素必须是相同的类型。在读入图像到NumPy数组后,就可以对它进行任何我们想要的操作了。前面已经对图像进行了灰度变换,现在要举一个极其有用的例子——灰度变换后进行直方图均衡化。通过直方图均衡化可以增加图像对比度。下面是对图像直方图进行均衡化处理的例子:
from PIL import Image
from pylab import *
from numpy import *
from PCV.tools import imtools
im = array(Image.open('../Pictures/04.jpg').convert('L')) # 打开图像,并转成灰度图像
im2, cdf = imtools.histeq(im)
figure()
subplot(2, 2, 1)
axis('off')
gray()
title('Original image')
imshow(im)
subplot(2, 2, 2)
axis('off')
title('Equalized image')
imshow(im2)
subplot(2, 2, 3)
title('Original histogram')
hist(im.flatten(), 128, normed=True)
subplot(2, 2, 4)
title('Equilibrium histogram')
hist(im2.flatten(), 128, normed=True)
show()
SciPy是建立在NumPy的基础上,用于数值运算的开源工具包。它提供了很多有效的常规操作,包括数值综合、最优化、统计、信号处理以及图像处理。SciPy库包含了很多有用的模块,接下来只展示部分功能。(SciPy的下载地址:http://scipy.org/Download )
一个非常经典的图像卷积例子是对图像进行高斯模糊(即高斯滤波)。高斯模糊可以用于定义图像尺度、计算兴趣点以及很多其他的应用场合。下面是对图像进行高斯滤波的例子:
from PIL import Image
from pylab import *
from scipy.ndimage import filters
im = array(Image.open('../Pictures/04.jpg').convert('L'))
figure()
gray()
axis('off')
subplot(1, 4, 1)
axis('off')
title('original image')
imshow(im)
for bi, blur in enumerate([5, 10, 15]): #不同的标准差,模糊程度不同
im2 = zeros(im.shape)
im2 = filters.gaussian_filter(im, blur)
im2 = np.uint8(im2)
imNum=str(blur)
subplot(1, 4, 2 + bi)
axis('off')
title('sigma = '+imNum)
imshow(im2)
show()
Python的工具包介绍到这里就结束了。虽然内容不多,但还是希望对你有帮助。
学习笔记+1 :)