詳解OpenCV和PIL讀取和顯示圖像的差異

本博客演示使用OpenCV和PIL讀取和顯示圖像的差異。

首先來看一下原始的bgr圖像 src.jpg

1. 使用cv2讀取src.jpg並轉為rgb格式的src_rgb.jpg並顯示和保存

#首先讀入並保存為rgb圖像
src_path = 'C:\\Users\\Administrator\\Desktop\\cv2_PIL\\src.png' # bgr
img = cv2.imread(src_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imshow('src_rgb.png', img)
cv2.imwrite('src_rgb.png', img)
cv2.waitKey(5000)

2. 使用cv2讀取src_rgb.jpg並顯示, 發現仍為rgb格式

# 讀入rgb格式的圖像並保存
src_path = 'C:\\Users\\Administrator\\Desktop\\cv2_PIL\\src_rgb.png' # rgb
img = cv2.imread(src_path)
cv2.imshow('src_rgb.png', img)
cv2.waitKey(5000)

由此可見cv2讀取bgr格式圖片為bgr格式讀入;讀取rgb格式圖片為rgb格式讀入。

3. 使用PIL讀取src.jpg並顯示

# 使用PIL讀取bgr格式圖片並顯示
src_path = 'C:\\Users\\Administrator\\Desktop\\cv2_PIL\\src.png' # bgr
img = Image.open(src_path)#.convert("RGB")
print(img.mode)
img.show("src.png")

由此可見PIL讀入bgr格式圖片為讀入後是rgb格式

4. 使用PIL讀取src.jpg並轉為numpy的array格式圖片並顯示

# 使用PIL讀取bgr格式圖片並顯示
src_path = 'C:\\Users\\Administrator\\Desktop\\cv2_PIL\\src.png' # bgr
img = Image.open(src_path)#.convert("RGB")
print(img.mode)
img = np.array(img) # rgb
cv2.imshow("src.png",img)
cv2.waitKey(5000)

所以進一步坐實瞭PIL讀入bgr格式圖片為讀入後是rgb格式

5. 使用PIL讀取rgb格式src_rgb.jpg並顯示

# 使用PIL讀取rgb格式圖片並顯示
src_path = 'C:\\Users\\Administrator\\Desktop\\cv2_PIL\\src_rgb.png' # rgb
img = Image.open(src_path)#.convert("RGB")
print(img.mode)
# img1 = img.load()
# print(img1[0,0])
#img.show()
img = np.asarray(img) # bgr
#print(img)
cv2.imshow("src_.png",img)
cv2.waitKey(5000)

可見PIL讀入rgb順序圖片後雖然為RGB格式,但是其實通道順序為BGR格式圖片

總結:

cv2讀取BGR圖片 img = cv2.imread(‘src.png’),其中img為BGR通道順序的圖片
cv2讀取RGB圖片 img = cv2.imread(‘src.png’),其中img為RGB通道順序的圖片
PIL讀入BGR圖片 img = Image.open(‘src.png’),顯示img為RGBA格式,其中img為RGBA通道順序的圖片; img = img.convert(‘RGB’)後,img為RGBA通道順序的圖片
PIL讀入RGB圖片 img = Image.open(‘src_rgb.png’),雖然顯示img為RGB格式,但是img為通道順序為BGR格式的圖片。

到此這篇關於詳解OpenCV和PIL讀取和顯示圖像的差異的文章就介紹到這瞭,更多相關OpenCV和PIL讀取和顯示圖像 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!