图1-18 从PIL的image对像转换为numpy ndarray对象
如下代码将展示如何将numpy ndarray转换为PIL image对象。运行代码后,会看到与图1-18相同的输出。
im = imread('../images/flowers.png') # read image into numpy ndarray with skimage
im = Image.fromarray(im) # create a PIL Image object from the numpy ndarray
im.show() # display the image with PIL Image.show() method
1.5.2 基本的图像操作
不同的Python库都可以用于基本的图像操作。几乎所有库都以numpy ndarray存储图像(例如灰度图像的二维数组和RGB图像的三维数组)。彩色Lena图像的正x和y方向(原点是图像二维数组的左上角)如图1-19所示。
图1-19 Lena彩色图像的坐标方向
1.使用numpy数组的切片进行图像处理如下代码显示了如何使用numpy数组的切片和掩模在Lena图像上创建圆形掩模:
lena = mpimg.imread("../images/lena.jpg") # read the image from disk as a numpy ndarray
print(lena[0, 40])
# [180 76 83]
# print(lena[10:13, 20:23,0:1]) # slicing
lx, ly, _ = lena.shape
X, Y = np.ogrid[0:lx, 0:ly]
mask = (X - lx / 2) ** 2 (Y - ly / 2) ** 2 > lx * ly / 4
lena[mask,:] = 0 # masks
plt.figure(figsize=(10,10))
plt.imshow(lena), plt.axis('off'), plt.show()
运行上述代码,输出结果如图1-20所示。
图1-20 Lena图像的圆形掩模
简单的图像变形—使用交叉溶解的两个图像的α混合 如下代码展示了通过使用如下公式给出的两张图像numpy ndarrays的线性组合,如何从一张人脸图像(image1是梅西的脸)开始,以另一张人脸图像(image2是C罗的脸)结束。
通过迭代地将α从0增加到1来实现图像的变形效果。
im1 = mpimg.imread("../images/messi.jpg") / 255 # scale RGB values in [0,1]
im2 = mpimg.imread("../images/ronaldo.jpg") / 255
i = 1
plt.figure(figsize=(18,15))
for alpha in np.linspace(0,1,20):
plt.subplot(4,5,i)
plt.imshow((1-alpha)*im1 alpha*im2)
plt.axis('off')
i = 1
plt.subplots_adjust(wspace=0.05, hspace=0.05)
plt.show()
运行上述代码,输出结果如图1-21所示,这是α-混合图像的序列。本书后续章节将介绍更加高级的图像变形技术。
2.使用PIL进行图像处理PIL提供了许多进行图像处理的函数,例如,使用点变换来更改像素值或对图像实现几何变换。使用PIL进行图像处理之前,加载鹦鹉的PNG图像,如下面的代码所示:
im = Image.open("../images/parrot.png") # open the image, provide the correct path
print(im.width, im.height, im.mode, im.format) # print image size, mode and format
# 486 362 RGB PNG
接下来将介绍如何使用PIL执行不同类型的图像操作。
(1)裁剪图像。可以使用带有所需矩形参数的crop()函数从图像中裁剪相应的区域,如下面的代码所示。
im_c = im.crop((175,75,320,200)) # crop the rectangle given by (left, top,right,
bottom) from the image
im_c.show()
运行上述代码,输出结果如图1-21所示,此图即所创建的裁剪图像。