赞
踩
PIL读取图片不直接返回numpy对象,可以用numpy提供的函数np.array()进行转换,亦可用Image.fromarray()再从numpy对象转换为原来的Image对象,读取,显示,保存以及数据格式转换方法见如下代码:
- from PIL import Image
- import numpy as np
-
- imagepath='cat.jpg'
- image=Image.open(imagepath)
- print(type(image)) #结果为<class 'PIL.JpegImagePlugin.JpegImageFile'>
- print(image.size) #结果为(822,694),这里注意Image输出的结果先显示列数,后显示行数
- image.show()
-
- image.save('cat1.jpg')
-
- # image to array
- image1=np.array(image)#获得numpy对象,RGB
- print(type(image1)) #结果为<class 'numpy.ndarray'>
- print(image1.shape) #结果为(694, 822, 3)
-
- # array to image
- image2 = Image.fromarray(image1)
- print(type(image2)) #结果为<class 'PIL.Image.Image'>

PIL只提供最基础的数字图像处理,功能有限;opencv本质上是一个c++库,只是提供了python的接口,官方更新速度非常慢,而且安装很不容易。综合来看,scikit-image是基于scipy的一款图像处理包,它功能非常齐全,同时将图片作为numpy数组进行处理,几乎集合了matlab的所有图像处理功能,在数据的处理方式,函数名字等方面对matlab的模仿姿势非常到位。推荐使用!
读取,显示,保存见如下代码:
- from skimage import io
-
- img=io.imread('cat.jpg')
- io.imshow(img)
-
- io.imsave('cat1.jpg',img)
科学计算库scipy中的方法,之前是scipy.misc,其下函数包括imread,imresize,imsave,新版misc被移除,改用imageio,需独立安装conda install imageio。
以下代码:
- import scipy
- image = scipy.misc.imread(image)
- image = scipy.misc.imresize(image, size=(num_px,num_px))
- scipy.misc.imsave('image.jpg', image)
应改为:
- import imageio
- import numpy as np
- from PIL import Image
-
- image = imageio.imread(image)
- image = np.array(Image.fromarray(image).resize((num_px,num_px)))
- image = imageio.imsave('image.jpg', image)
读取,保存方法见如下代码:
- import imageio
-
- imagepath='cat.jpg'
- image = imageio.imread(imagepath)
- print(type(image)) #结果为<class 'imageio.core.util.Array'> ,即为numpy数组
-
- imageio.imsave("cat1.jpg", image)
无显示方法,但其读取后的类型为numpy数据,故可用之后的plt.imshow()显示。
从名字中可以看出这个模块是具有matlab风格的,故所处理的数据均为numpy数据。
读取,显示,保存方法见如下代码:
- import matplotlib.pyplot as plt
- import matplotlib.image as mpimg
-
- imagepath='cat.jpg'
- image = mpimg.imread(imagepath)
- print(type(image)) #结果为<class 'numpy.ndarray'>
- print(image.shape) #结果为(694, 822, 3)
-
- plt.imshow(image)
-
- mpimg.imsave("cat1.jpg", image)
使用opencv读取图像,同样返回numpy数据,与其他不同的是,通道顺序为BGR ,而不是RGB,cv2.imread的图片是BGR,cv2.imshow 时相应的换通道显示,所以仍会显示出原来的图片
读取,显示,保存方法见如下代码:
- import cv2
- import matplotlib.pyplot as plt
-
- imagepath='cat.jpg'
- image = cv2.imread(imagepath)
- print(type(image)) #结果为<class 'numpy.ndarray'>
- print(image.shape) #结果为(694, 822, 3)
-
- cv2.imshow('bgrImage',image)
- cv2.waitKey()
- cv2.destroyAllWindows()
- plt.subplot(121)
- plt.imshow(image)
-
- # BGR to RGB
- image_rgb = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
- cv2.imshow('rgbImage',image_rgb)
- cv2.waitKey()
- cv2.destroyAllWindows()
- plt.subplot(122)
- plt.imshow(image_rgb)
-
- cv2.imwrite("cat1.jpg", image)

代码中还利用plt.imshow与cv2.imshow进行了对比,以及bgr转换rgb后plt.imshow与cv2.imshow进行了对比,显示结果为:
由图可得,cv2.imshow会在cv2.imread后正常显示rgb图像,此时plt.imshow()会显示gbr图像;bgr转换为rgb后,plt.imshow()会正常显示rgb图像,而cv2.imshow()会显示gbr图像。有点绕口,请结合代码对比理解。
keras中处理图像的工具,其底层封装的实际为PIL,不过多讲解。
- from keras.preprocessing import image
-
- imagepath='cat.jpg'
- img = image.load_img(imagepath)
-
- img.show()
-
- img.save("cat1.jpg")
-
- # image to array
- image1 = image.img_to_array(img)
- # array to image
- image2 = image.array_to_img(image1)
以上模块中PIL、opencv-python拥有读入图片后resize的功能,代码如下:
- imagepath='cat.jpg'
-
- from PIL import Image
-
- image = Image.open(imagepath)
- image_resize = image.resize((128, 128))
-
-
-
- import cv2
-
- raw_image = cv2.imread(imagepath)
- image_resize = cv2.resize(raw_image, (128, 128))
-
-
-
- from keras.preprocessing import image
-
- raw_image = image.load_img(imagepath, target_size=(128, 128))
-
-
-
- from skimage import io, transform
-
- img=io.imread(imagepath)
- img = transform.resize(img, (128, 128))

需要注意的是,不论是哪种方法函数读入图片,显示图片皆可用plt.imshow()来操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。