Python计算机视觉编程
基本的图像操作和处理
(一)PIL:Python 图像处理类库
PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功能, 以及大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。虽然PIL是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。
下面介绍PIL Image类中常用的函数:
open(filename,mode) #读取一张图像
convert(mode,matrix,dither,palette,colors) #图像的颜色转换
编写代码:
from PIL import Image
from pylab import *
pil_im = Image.open('D:\\Python\\chapterone\\dog.jpg')
gray()
subplot(131)
title('(a)')
axis('off')
imshow(pil_im)
pil_i = Image.open('D:\\Python\\chapterone\\dog.jpg').convert('L') #图像转换为灰度图像
subplot(132)
title('(b)')
axis('off')
imshow(pil_i)
im_rgb = pil_i.convert("RGB") #灰度图像转换为RGB图像
subplot(133)
title('(c)')
axis('off')
imshow(im_rgb)
show()
代码运行效果如下:
分析:
convert方法可以改变图像的mode,一般是在’RGB’(真彩图)、‘L’(灰度图)、‘CMYK’(压缩图)之间转换。上面的代码就是首先将图像转化为灰度图,再从灰度图转化为真彩图。值得注意的是,从灰度图转换为真彩图,虽然理论上确实转换成功了,但是实际上是很难恢复成原来的真彩模式的。
1.1 转换图像格式
通过 save() 方法,PIL 可以将图像保存成多种格式的文件。
函数:
save(filename,format)
编写代码:
from PIL import Image
from pylab import *
im = Image.open('D:\\Python\\chapterone\\dog.jpg', "r")
dog = im.save('D:\\Python\\chapterone\\dog.png', 'png')
dog.show()
代码运行效果如下:
分析:
上面的代码将jpg图像重新保存成png格式。注意,保存文件的文件名很重要,除非指定格式,否则这个库将会以文件名的扩展名作为格式保存。
1.2 创建缩略图
Image 类的 thumbnail() 方法可以用来制作缩略图。它接受一个二元数组作为缩略图的尺寸,然后将示例缩小到指定尺寸。
函数:
thumbnail(size,resample)
thumbnail方法是原地操作,返回值是None。第一个参数是指定的缩略图的大小,第二个是采样的,有Image.BICUBIC,PIL.Image.LANCZOS,PIL.Image.BILINEAR,PIL.Image.NEAREST这四种采样方法。默认是Image.BICUBIC。
编写代码:
from PIL import Image
from pylab import *
im = Image.open('D:\\Python\\chapterone\\flower5.jpg', "r")
subplot(121)
title('(a)')
axis('off')
imshow(im)
im.save('D:\\Python\\chapterone\\flower5.png', 'png')
im.thumbnail((128, 128), resample=Image.BICUBIC)
subplot(122)
title('(b)')
axis('off')
imshow(im)
show()
代码运行效果如下:
编写代码:
from PIL import Image
from pylab import *
im = Image.open('D:\\Python\\chapterone\\flower5.jpg', "r")
im.save('D:\\Python\\chapterone\\flower5.png', 'png')
im.show()
im.thumbnail((128, 128), resample=Image.BICUBIC)
im.show()
代码运行效果如下:
分析:
从第一幅图可以看出,创建最长边为 128 像素的缩略图,图像在同样大小的情况下展示,会变得模糊,从第二幅图可以看出,正常情况下展示指定像素的缩略图,图像会变小。
1.3 复制和粘贴图像区域
使用 crop() 方法可以从一幅图像中裁剪指定区域:
函数:
crop(box)
编写代码:
from PIL import Image
from pylab import *
im = Image.open('D:\\Python\\chapterone\\flower5.jpg', "r")
subplot(121)
title('(a)')
axis('off')
imshow(im)
box = (100,500,400,700)
subplot(122)
title('(b)')
axis('off')
imshow(im.crop(box))
show()
代码运行效果如下:
分析:
上面的代码在im图像上裁剪了一个box矩形区域,然后显示出来。box是一个有四个数字的元组(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分别表示裁剪矩形区域的左上角x,y坐标,右下角的x,y坐标,规定图像的最左上角的坐标为原点(0,0),宽度的方向为x轴,高度的方向为y轴,每一个像素代表一个坐标单位。crop()返回的仍然是一个Image对象。
paste() 方法则可以将一个 Image 示例粘贴到另一个 Image 示例上。
函数:
paste(region,box,mask)
编写代码:
from PIL import Image
from pylab import *
im = Image.open('D:\\Python\\chapterone\\flower5.jpg', "r")
subplot(131)
title('(a)')
axis('off')
imshow(im)
box = (100,500,400,700)
subplot(132)
title('(b)')
axis('off')
imshow(im.crop(box))
region = im.crop(box)
im.paste(region,(300,200),None)
subplot(133)
title('(c)')
axis('off')
imshow(im)
show()
代码运行效果如下:
分析:
上面的代码将region图像粘贴到左上角为(300,200)的位置(也就是雏菊图像的右上角)。region是要粘贴的Image对象,box是要粘贴的位置,可以是一个两个元素的元组,表示粘贴区域的左上角坐标,也可以是一个四个元素的元组,表示左上角和右下角的坐标。如果是四个元素元组的话,box的size必须要和region的size保持一致,否则将会被转换成和region一样的size。
1.4 调整尺寸和旋转
transpose() 方法可以将图片左右颠倒、上下颠倒、旋转 90°、旋转 180° 或旋转 270°
函数:
transpose(method) #method表示选择什么样的翻转或者旋转方式
编写代码:
from PIL import Image
from pylab import *
im = Image.open('D:\\Python\\chapterone\\lovely2.jpg', "r")
subplot(331)
title('(a)')
axis('off')
imshow(im)
Image.FLIP_LEFT_RIGHT = im.transpose(Image.FLIP_LEFT_RIGHT)
subplot(332)
title('(b)')
axis('off')
imshow(Image.FLIP_LEFT_RIGHT)
Image.FLIP_TOP_BOTTOM = im.transpose(Image.FLIP_TOP_BOTTOM)
subplot(333)
title('(c)')
axis('off')
imshow(Image.FLIP_TOP_BOTTOM)
Image.ROTATE_45 = im.rotate(45)
subplot(334)
title('(d)')
axis('off')
imshow(Image.ROTATE_45)
Image.ROTATE_90 = im.transpose(Image.ROTATE_90)
subplot(335)
title('(e)')
axis('off')
imshow(Image.ROTATE_90)
Image.ROTATE_180 = im.transpose(Image.ROTATE_180)
subplot(336)
title('(f)')
axis('off')
imshow(Image.ROTATE_180)
Image.ROTATE_270 = im.transpose( Image.ROTATE_270)
subplot(337)
title('(g)')
axis('off')
imshow( Image.ROTATE_270)
Image.TRANSPOSE = im.transpose(Image.TRANSPOSE)
subplot(338)
title('(h)')
axis('off')
imshow(Image.TRANSPOSE)
Image.TRANSVERSE = im.transpose(Image.TRANSVERSE)
subplot(339)
title('(i)')
axis('off')
imshow(Image.TRANSVERSE)
show()
代码运行效果如下:
分析:
( b ) Image.FLIP_LEFT_RIGHT,表示将图像左右翻转
( c ) Image.FLIP_TOP_BOTTOM,表示将图像上下翻转
( d ) rotate(45),表示将图像逆时针旋转45°
( e ) Image.ROTATE_90,表示将图像逆时针旋转90°
( f ) Image.ROTATE_180,表示将图像逆时针旋转180°
( g ) Image.ROTATE_270,表示将图像逆时针旋转270°
( h ) Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)
( i ) Image.TRA