一、PIL:Python Imaging Library(pillow)
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'>
二、scikit-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)
三、imageio
科学计算库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()显示。
四、matplotlib
从名字中可以看出这个模块是具有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)
五、cv2: opencv-python
使用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.preprocessing
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)
七、补充知识resize
以上模块中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()
需要注意的是,不论是哪种方法函数读入图片,显示图片皆可用plt.imshow()来操作。