对图像作基础处理之前需要先安装PIL(Python Imaging Library, 图像处理类库)。它提供了通用的图像处理功能,以及大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。下载地址:(http://www.pythonware.com/products/pil/)。
一、读取一幅图像
代码如下:
from PIL import Image
pil_im = Image.open('D:/aa.jpg')
pil_im.show()
pil_im返回的是一个PIL图像对象
运行结果:
如果要将这幅图转成灰度图像,只需要加上convert(‘L’)。
代码如下:
pil_im = Image.open('D:/aa.jpg').convert('L')
运行结果:
二、创建缩略图
使用PIL可以很方便地创建图像的缩略图。thumbnail()方法接受一个元组参数(该参数指定生成缩略图的大小),然后将图像转换成符合元组参数指定大小的缩略图。
代码如下:
from PIL import Image
pil_im = Image.open('D:/aa.jpg')
print("初始尺寸",pil_im.size)
pil_im.thumbnail((128,95))
print("缩略尺寸",pil_im.size)
运行结果:
初始尺寸 (377, 281)
缩略尺寸 (128, 95)
三、调整尺寸和旋转
要调整一幅图像的尺寸,可以调用resize()方法。该方法的参数是一个元组,用来指定新图像的大小。
代码如下:
from PIL import Image
pil_im = Image.open('D:/aa.jpg')
out = pil_im.resize((128,128))
out.show()
运行结果:
要旋转一幅图像,可以使用逆时针方式表示旋转角度,然后调用rotate()方法。
代码如下:
from PIL import Image
pil_im = Image.open('D:/aa.jpg')
out = pil_im.rotate(45)
out.show()
运行结果:
注意thumbnail()方法和resize()方法的不同之处:
1.resize()方法可以缩小也可以放大,而thumbnail()方法只能缩小;
2.resize()方法不会改变对象的大小,只会返回一个新的Image对象,而thumbnail()方法会直接改变对象的大小,返回值为none;
3.resize()方法中的size参数直接规定了修改后的大小,而thumbnail()方法按比例缩小,size参数只规定修改后size的最大值。
四、复制和粘贴图像区域
使用crop()方法可以从一幅图像中裁剪指定区域。
代码如下:
from PIL import Image
pil_im = Image.open('D:/aa.jpg')
box = (50,50,200,200)
region = pil_im.crop(box)
region.show()
运行结果:
要知道box = (50, 50, 200, 200)区域由一个4元组定义,表示为坐标是 (left, upper, right, lower)。 Python Imaging Library 使用左上角为 (0, 0)的坐标系统。同时要注意,这些坐标指向像素之间的位置,因此上述例子中描述的区域的大小为150x150像素。后两个数字需要比前两个大。
接下来我们可以旋转上面的代码中获取的区域,然后使用paste()方法将该区域放回去。
代码如下:
from PIL import Image
pil_im = Image.open('D:/aa.jpg')
box = (50,50,200,200)
region = pil_im.crop(box)
region = region.transpose(Image.ROTATE_180)
pil_im.paste(region,box)
pil_im.show()
运行结果:
五、图像轮廓和直方图
因为绘制轮廓需要对每个坐标[x,y]的像素值施加同一个阈值,所以需要先将图像灰度化。灰度图像的直方图可以使用hist()函数绘制。
代码如下:
from PIL import Image
from pylab import *
im = array(Image.open('D:/aa.jpg').convert('L'))
figure()
gray()
contour(im,origin='image')
axis('equal')
axis('off')
figure()
hist(im.flatten(),128)
show()
运行结果:
六、直方图均衡化
直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中的每个灰度值的分布概率都相同。直方图均衡化的变换函数是图像中像素值的累积分布函数(cumulative distribution function,简写为cdf,将像素值的范围映射到目标范围的归一化操作)。
代码如下:
from PIL import Image
from pylab import *
from numpy import *
from PCV.tools import imtools
im = array(Image.open('D:/aa.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)
axis('off')
title('Original histogram')
hist(im.flatten(), 128, normed=True)
subplot(2, 2, 4)
axis('off')
title('Equilibrium histogram')
hist(im2.flatten(), 128, normed=True)
show()
运行结果:
七、高斯模糊
图像的高斯模糊是非常经典的图像卷积例子。Scipy有用来做滤波操作的scipy.ndimage.filters模块。该模块使用快速一维分离的方式来计算卷积。
代码如下:
from PIL import Image
from pylab import *
from scipy.ndimage import filters
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('D:/aa.jpg').convert('L'))
figure()
gray()
axis('off')
subplot(1, 4, 1)
axis('off')
title(u'原图', fontproperties=font)
imshow(im)
for bi, blur in enumerate([2, 5, 10]):
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(u'标准差为'+imNum, fontproperties=font)
imshow(im2)
show()
运行结果: