使用python进行数字图片处理,需要安装Pillow包, 它是由PIL发展而来的。
pip install Pillow
1、图片打开、显示
from PIL import Image
img=Image.open('**.png')#相对路径
#img=Image.open('d:/***/**.png')#绝对路径
img.show()
这种图片显示方式是调用操作系统自带的图片浏览器来打开图片,有些时候这种方式不太方便,因此我们也可以使用另上一种方式,让程序来绘制图片。
from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('**.png')
plt.figure("dog")
plt.imshow(img)
plt.show()
使用一个matplotlib的库来绘制图片进行显示。
matplotlib是一个专业绘图的库,相当于matlab中的plot,可以设置多个figure,并设置figure的信息,可以使用subplot在一个figure中显示多张图片。
figure默认是带axis的,如果没有需要,我们可以关掉
plt.axis('off')
打开图片后,可以使用一些属性来查看图片信息,如
print img.size #图片的尺寸(width, height)
print img.mode #图片的模式RGBA
print img.format #图片的格式PNG
2、图片保存
img.save('f:/***/***.jpg')
3、图片处理
1、图片模式转换convert()
img=Image.open('d:/ex.jpg')
gray=img.convert('L')
使用函数convert()来进行转换,它是图像实例对象的一个方法,接受一个 mode 参数,用以指定一种色彩模式,mode 的取值可以是
|
mode | 含义 |
---|---|
1 | 1位像素,黑白,每字节一个像素存储 |
L | 8位像素,黑白 |
P | 8位像素,使用调色板映射到任何其他模式 |
P | |
RGB | 3x8位像素,真彩色 |
RGBA | 4x8位像素,带透明度掩模的真彩色 |
CMYK | 4x8位像素,分色 |
YCbCr | 3x8位像素,彩色视频格式 |
I | 32位有符号整数像素 |
F | 32位浮点像素 |
2、通道分离与合并
from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('d:/ex.jpg') #打开图像
gray=img.convert('L') #转换成灰度
r,g,b=img.split() #分离三通道
pic=Image.merge('RGB',(r,g,b)) #合并三通道
#显示
plt.figure("beauty")
plt.subplot(2,3,1), plt.title('origin')
plt.imshow(img),plt.axis('off')
plt.subplot(2,3,2), plt.title('gray')
plt.imshow(gray,cmap='gray'),plt.axis('off')
plt.subplot(2,3,3), plt.title('merge')
plt.imshow(pic),plt.axis('off')
plt.subplot(2,3,4), plt.title('r')
plt.imshow(r,cmap='gray'),plt.axis('off')
plt.subplot(2,3,5), plt.title('g')
plt.imshow(g,cmap='gray'),plt.axis('off')
plt.subplot(2,3,6), plt.title('b')
plt.imshow(b,cmap='gray'),plt.axis('off')
plt.show()
3.裁剪图片
从原图片中裁剪感兴趣区域(roi),裁剪区域由4-tuple决定,该tuple中信息为(left, upper, right, lower)。 Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点。
from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('d:/ex.jpg') #打开图像
plt.figure("beauty")
plt.subplot(1,2,1), plt.title('origin')
plt.imshow(img),plt.axis('off')
box=(80,100,260,300)#裁剪框
roi=img.crop(box)#裁剪图片
plt.subplot(1,2,2), plt.title('roi')
plt.imshow(roi),plt.axis('off')
plt.show()
注:用plot绘制显示出图片后,将鼠标移动到图片上,会在右下角出现当前点的坐标,以及像素值。
4、几何变换
Image类有resize()、rotate()和transpose()方法进行几何变换。
1、图像的缩放和旋转
dst = img.resize((128, 128))
dst = img.rotate(45) # 顺时针角度表示
2、转换图像
dst = im.transpose(Image.FLIP_LEFT_RIGHT) #左右互换
dst = im.transpose(Image.FLIP_TOP_BOTTOM) #上下互换
dst = im.transpose(Image.ROTATE_90) #顺时针旋转90度
dst = im.transpose(Image.ROTATE_180) #顺时针旋转180度
dst = im.transpose(Image.ROTATE_270) #顺时针旋转270度