天天看點

matplotlib、PIL、cv2圖像操作 && caffe / tensorflow 通道順序

用python進行圖像進行中分别用到過matplotlib.pyplot、PIL、cv2三種庫,這三種庫圖像讀取和儲存方法各異,并且圖像讀取時順序也有差異,如plt.imread和PIL.Image.open讀入的都是RGB順序,而cv2.imread讀入的是BGR順序。使用時需要倍加注意。

現參考http://www.jianshu.com/p/3977d674da85。對這三種庫圖像讀取儲存進行梳理。與原參考資源有一定差異。目前使用為python3.5版本。

讀取圖像

1.matplotlib.pyplot

matplotlib讀取進來的圖檔是unit8,0-255範圍。

2.PIL.image.open

PIL是有自己的資料結構的,但是可以轉換成numpy數組,轉換後的數組為unit8,0-255

3.cv2.imread

opencv讀進來的是numpy數組,類型是uint8,0-255。

4.plt.imread和PIL.Image.open讀入的都是RGB順序,而cv2.imread讀入的是BGR順序。使用時需要倍加注意。

顯示圖像

均用plt.imshow(img):因為opencv讀取進來的是bgr順序呢的,而imshow需要的是rgb順序,是以需要先反過來plt.imshow(img[..., -1::-1])。

儲存圖像

1 PIL.image - 儲存PIL格式的圖檔

img.save("1.jpg")

2.cv2.imwrite - 儲存numpy格式的圖檔

cv2.imwrite("1.jpg")

OpenCV讀取的圖檔從BGR轉換為RGB

import cv2

img=cv2.imread(‘imagename’)

方法一

b,g,r=cv2.split(img)

img2=cv2.merge([r.g.b])

方法二

img2=img[: , : , : : -1]

- 顯示 b,g,r = cv2.split(img) img_rgb = cv2.merge([r,g,b]) plt.figure() plt.imshow(img_rgb) plt.show()

- caffe / tensorflow 通道順序問題

img = np.transpose(img, (0, 2, 3, 1))
 
img = img.reshape(img.shape[0], img.shape[2], img.shape[3], img.shape[1])
 
img_new = zeros((img.shape[0], img.shape[2], img.shape[3], img.shape[1]), dtype = np.float32)
for c in range(0, img.shape[1]):
    for i in range(0, img.shape[2]):
        for j in range(0, img.shape[3]):
            img_new[:,c,i,j] = img_new[:,i,j,c]       

C/C++基本文法學習

STL

C++ primer