python中opencv 與 PIL讀圖區別,以及與Numpy轉換

之前在圖片預處理上就遇到過opencv和PIL,很糾結PIL讀取的圖片不好在opencv上使用,或者是opencv讀取的圖片不好在PIL上使用,以及它們如何轉換爲numpy類型。現在有時間,做個小實驗總結一下

附上代碼

import numpy as np
import cv2
from PIL import Image
import matplotlib.pyplot as plt
img_cv2 = cv2.imread("jena.jfif")
img_PIL = Image.open("jena.jfif")
array_img_PIL = np.array(img_PIL) #轉爲numpy的array形式
#取部分數據顯示 opencv bgr排列,PIL rgb排列
print("img_cv2:\n",img_cv2[:3,0,:])
print("img_pil:\n",array_img_PIL[:3,0,:])

plt.subplot(1,2,1)
plt.title("img_PIL")
plt.imshow(array_img_PIL) #使用img_PIL也可以顯示,這裏直接使用array
plt.subplot(1,2,2)
plt.title("img_cv2")
plt.imshow(img_cv2)
plt.show()

#將rgb排列形式轉爲bgr排列形式,然後用opencv函數來顯示就是正常的圖片了
pil_to_cv2_img = cv2.cvtColor(array_img_PIL,cv2.COLOR_RGB2BGR)
print("img_pil_to_cv2\n",pil_to_cv2_img[:3,0,:])
cv2.imshow("pil_to_cv2_img",pil_to_cv2_img)
cv2.waitKey(0)

結果如下:
使用plt分別畫出的plt讀取的圖和opencv讀取的圖:
使用plt分別畫出的plt讀取的圖和opencv讀取的圖
打印圖片部分數據進行對比:
img_cv2:
[[112 152 224]
[110 151 224]
[104 149 223]]
img_pil:
[[224 152 114]
[223 151 111]
[222 149 104]]
img_pil_to_cv2
[[114 152 224]
[111 151 223]
[104 149 222]]

從前2組數據可以看出,opencv讀取的圖和PIL讀取的圖在r和b通道互換了,這裏要說明一點,opencv和plt讀取的圖片像素值不是完全相同的,大致相同。

將PIL圖片轉化爲opencv格式的圖片,即將rgb排列形式轉爲bgr排列形式,然後用opencv函數來顯示就是正常的圖片了。這裏使用了 cv2.cvtColor()進行轉換,從後2組數據可以看出,r和g通道數據進行了互換。

整個流程:

img_PIL = Image.open("jena.jfif")
array_img_PIL = np.array(img_PIL) #轉爲numpy的array形式
pil_to_cv2_img = cv2.cvtColor(array_img_PIL,cv2.COLOR_RGB2BGR)
cv2.imshow("pil_to_cv2_img",pil_to_cv2_img)
cv2.waitKey(0)

在這裏插入圖片描述

說了半天,如何將opencv或PIL讀取的圖片轉換爲numpy的array類型呢?

其實上面的代碼就已經交代好了,通過cv2.imread()返回的結果就是array類型,PIL需要通過np.array()進行轉化。圖片顯示,不管是opencv,還是PIL,都可以直接使用array。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章