本节将讨论不同的图像处理函数(使用点变换和几何变换),以及如何处理不同类型的图像。
1.5.1 处理不同的文件格式和图像类型图像可以以不同的文件格式和不同的模式(类型)保存。接下来我们将讨论如何使用Python库来处理不同文件格式和类型的图像。
1.文件格式图像文件可以有不同的格式,其中一些流行的格式包括BMP(8位、24位、32位)、png、JPG(JPEG)、GIF、PPM、PNM和TIFF。读者不需要担心图像文件的特定格式(如何存储元数据)以及从中提取数据。
Python图像处理库将读取图像,并提取数据和一些其他有用的信息(例如图像尺寸、类型/模式和数据类型)。
从一种文件格式转换为另一种文件格式 使用PIL可以读取一种文件格式的图像并将其保存为另一种文件格式,将PNG格式的图像保存为JPG格式的图像的代码如下:
im = Image.open("../images/parrot.png")
print(im.mode)
# RGB
im.save("../images/parrot.jpg")
但如果PNG文件是在RGBA模式下,则读者在将其保存为JPG格式之前需要将其转换为RGB模式,否则将报错。以下代码展示了先转换再保存的方法:
im = Image.open("../images/hill.png")
print(im.mode)
# RGBA
im.convert('RGB').save("../images/hill.jpg") # first convert to RGB mode
2.图像类型(模式)
图像可以是以下不同的类型。
一种图像模式转换为另一种图像模式 读者可以在读取图像本身的同时将RGB图像转换为灰度图像,如下面的代码所示:
im = imread("images/parrot.png", as_gray=True)
print(im.shape)
#(362L, 486L)
请注意,在将某些彩色图像转换为灰度图像时,可能会丢失一些信息。以下代码显示了使用石原板(Ishihara plate)检测色盲这样一个例子,这里使用color模块中的rgb2gray ()函数,彩色和灰度图像并排显示。
im = imread("../images/Ishihara.png")
im_g = color.rgb2gray(im)
plt.subplot(121), plt.imshow(im, cmap='gray'), plt.axis('off')
plt.subplot(122), plt.imshow(im_g, cmap='gray'), plt.axis('off')
plt.show()
运行上述代码,输出结果如图1-15所示。可以看到,彩色图像转换成了灰度图像。在彩色图像中,数字8是可见的,而在转换后的灰色版本图像中,数字8几乎不可见。
图1-15 彩色图像至灰色图像的转换
3.一些颜色空间(通道)图像的几个常用通道/颜色空间包括RGB、HSV、XYZ、YUV、YIQ、YPbPr、YCbCr和YDbDr。我们可以使用仿射映射将图像从一个颜色空间转换到另一个颜色空间。RGB颜色空间与YIQ颜色空间的线性映射关系矩阵如图1-16所示。
图1-16 RGB颜色空间与YIQ颜色空间映射关系矩阵
从一个颜色空间转换到另一个颜色空间 读者可以使用库函数从一个颜色空间转换到另一个颜色空间,例如将图像从RGB颜色空间转换为HSV颜色空间,代码如下所示:
im = imread("../images/parrot.png")
im_hsv = color.rgb2hsv(im)
plt.gray()
plt.figure(figsize=(10,8))
plt.subplot(221), plt.imshow(im_hsv[...,0]), plt.title('h', size=20),
plt.axis('off')
plt.subplot(222), plt.imshow(im_hsv[...,1]), plt.title('s', size=20),
plt.axis('off')
plt.subplot(223), plt.imshow(im_hsv[...,2]), plt.title('v', size=20),
plt.axis('off')
plt.subplot(224), plt.axis('off')
plt.show()
上述代码的运行结果如图1-17所示,即创建的鹦鹉HSV图像的H(hue或color:色调)、S(饱和度或浓度)和V(明度)通道。类似地,读者可以使用rgb2yuv()函数将图像转换到YUV颜色空间。
图1-17 从RGB颜色空间转换为HSV颜色空间的鹦鹉图像
4.由于存储图像的数据结构如前所述,PIL使用Image对象存储图像,而scikit-image使用numpy ndarray数据结构存储图像数据。接下来,我们将描述如何在这两个数据结构之间进行转换。
转换图像数据结构 如下代码将展示如何从PIL的Image对象转换为numpy ndarray(由scikit-image使用):
im = Image.open('../images/flowers.png') # read image into an Image object with PIL
im = np.array(im) # create a numpy ndarray from the Image object
imshow(im) # use skimage imshow to display the image
plt.axis('off'), show()
运行上述代码,输出结果如图1-18所示,可以看到,输出的是一幅花的图像。