图1-21 裁剪的鹦鹉图像
(2)调整图像尺寸。为了增大或缩小图像的尺寸,可以使用resize()函数,该函数可在内部分别对图像进行上采样或下采样。这部分内容将在下一章中详细讨论。
① 调整为较大的图像。从尺寸为149×97的小时钟图像开始,创建一个更大尺寸的图像。如下代码展示了将要处理的小时钟图像。
im = Image.open("../images/clock.jpg")
print(im.width, im.height)
# 107 105
im.show()
运行上述代码,输出结果如图1-22所示,此图即小时钟图像。
图1-22 小时钟图像
下一行代码说明了通过使用双线性插值(一种上采样技术),如何使用resize()函数放大先前的输入时钟图像(放大5倍),以获得比输入图像放大25倍的输出图像。
有关此技术如何工作的详细信息将在第2章中讲述。
im_large = im.resize((im.width*5, im.height*5), Image.BILINEAR) # bi-linear interpolation
② 调整为较小的图像。现在让我们来做相反的事情:从维多利亚纪念堂的大图像(尺寸为720×540)开始,创建一个尺寸较小的图像。如下代码显示了将开始处理的大图像。
im = Image.open("../images/victoria_memorial.png")
print(im.width, im.height)
# 720 540
im.show()
运行上述代码,输出结果如图1-23所示,图为维多利亚纪念堂的大图像。
图1-23 维多利亚纪念堂图像
下面一行代码说明了如何使用resize()函数来缩小维多利亚纪念堂的当前图像,通过使用抗锯齿(一种高质量的下采样技术),将图像的宽度和高度都调整为原宽度和调试的1/5。读者将在第2章中看到它是如何实现的。
im_small = im.resize((im.width//5, im.height//5), Image.ANTIALIAS)
(3)图像负片。可以使用point()函数,用单参数函数来转换每个像素值。可以使用它来生成图像负片,如下面的代码所示。像素值用1字节无符号整数表示,因此,从最大可能值中减去该值将是每个像素上获得图像反转所需的精确点操作。
im = Image.open("../images/parrot.png")
im_t = im.point(lambda x: 255 - x)
im_t.show()
运行上述代码,输出结果如图1-24所示,图中即是鹦鹉负片图像。
图1-24 鹦鹉图像的负片
(4)将图像转换为灰度图。可以使用带有“L”参数的convert()函数将RGB彩色图像更改为灰度图像,如下面的代码所示:
im_g = im.convert('L') # convert the RGB color image to a grayscale image
本书将在接下来的几个灰度转换中使用这个图像。
(5)某些灰度级变换。在这里将探讨两个变换。其中一个使用一个函数,将输入图像中的每个像素值变换为输出图像的相应像素值。函数point()可用于此操作。每个像素的值介于0到255之间(含0和255)。
① 对数变换。对数变换可以有效地压缩具有动态像素值范围的图像。下面的代码使用了点变换进行对数变换:
im_g.point(lambda x: 255*np.log(1 x/255)).show()
图1-25显示了鹦鹉图像的对数变换,可以看到,像素值的范围缩小,输入图像中较亮的像素变暗,较暗的像素变亮,从而缩小了像素值的范围。