方法一:利用 PIL 中的 Image 函数
这个函数读取出来不是 array 格式,这时候需要用 np.asarray(im) 或者 np.array(im)函数将其处理成array格式。
区别:np.array() 是深拷贝,np.asarray() 是浅拷贝。浅拷贝只拷贝父对象,不会拷贝对象的内部的子对象;深拷贝会拷贝对象及其子对象。
1 from PIL import Image
2 import numpy as np
3
4 #读取
5 image = Image.open('fur.jpg')
6 #显示
7 image.show()
8 #保存
9 image.save('new.jpg')
10 #转换成array
11 im_array = np.array(image)
12 print(im_array.shape)
13 #array转换成image
14 img = Image.fromarray(np.uint8(im_array))
15 img.save('new1.jpg') #还可以指定图片质量img.save('new1.jpg',quality=95),默认值为75
方法二:利用 matplotlib
利用 matplotlib.pyplot as plt 用于显示图片;利用matplotlib.image as mpimg 用于读取图片,并且读取出来就是 array 格式。
1 import matplotlib.pyplot as plt
2 import matplotlib.image as mpimg
3 import numpy as np
4
5 img = mpimg.imread('fur.jpg')
6 print(img.shape)
7 plt.imshow(img) #该函数负责对图像进行处理,并显示其格式,但不能显示,其后跟着plt.show()才能显示出来
8 plt.axis('off') #不显示坐标轴
9 plt.show()
10 plt.savefig('new.jpg')
方法三:利用 OpenCV-Python 接口
cv2.imread() 读出来同样是 array 形式,但是如果是单通道的图,读出来的是三通道的。
1 import cv2
2
3 img = cv2.imread('fur.jpg')
4 h,w,c = img.shape
5 cv2.imshow('window_title', img)
6 cv2.waitKey(5000) #里面的参数表示延迟多少毫秒,默认为0.当参数小于等于0时,可以理解为延迟无穷大毫秒,就是暂停了。不使用该函数的话会发现图片一闪而过,观察不到。
7 cv2.imwrite('new2.jpg',img)
方法四:图像处理库 Scipy
读出来是 array 形式,并且按照(H,W,C)形式保存
1 import scipy.misc
2 import matplotlib.pyplot as plt
3
4 img = scipy.misc.imread('fur.jpg')
5 scipy.misc.imsave('new3.jpg',img)
6 plt.imshow(img)
7 plt.show()