天天看點

C語言opencv圖像識别,【數字圖像處理c】OpenCV中cv2.imread()與PIL中Image.open()的差别...

cv2.imread()與PIL中Image.open()兩個函數都是用來讀取圖像,但是在使用過程存在一些差别。

1. 首先,從導入庫方面看:

#opencv-python

importcv2#PIL

from PIL import Image

2. 讀取圖像

#opencv-python

img = cv2.imread(‘‘ ---.jpg‘‘)

img= cv2.imread(‘‘ ---.jpg‘‘, flages=cv2.IMREAD_GRAYSCALE) #flags是可選讀入模式,如灰階圖等,預設為None

#PIL

img = Image.open("---.jpg")

img= Image.open("---.jpg", mode=‘r’ ) #mode隻能并且預設是‘r’,未查閱到相關資料,暫時不清楚具體代表什麼。

值得注意的是,在文檔中對Image.open()函數的描述如下:

Opens andidentifies the given image file.

Thisisa lazy operation; this function identifies the file, but

the file remains openand the actual image data is not read fromthe file until youtry to process the data (orcall the

:py:meth:`~PIL.Image.Image.load` method). See

:py:func:`~PIL.Image.new`. See :ref:`file-handling`.

Image.open()函數隻是保持了圖像被讀取的狀态,但是圖像的真實資料并未被讀取,是以如果對需要操作圖像每個元素,如輸出某個像素的RGB值等,需要執行對象的load()方法讀取資料。具體如下:

img = Image.open("lena.jpg")

img=img.load()print(img[0,0])#result:(255, 201, 166)

3. 預設讀入圖像通道

對于Image.open()函數預設真彩圖像讀取通道順序為RGB,而cv2.imread()則是BGR。同時,當圖像格式為RGBA時,Image.open(‘---.jpg’)讀取的格式為RGBA(其中A表示圖像的alpha通道,即RGBA共四個通道),而cv2.imread(‘---.jpg‘)讀取的格式是BGR,隻有三個通道。

(1)

importcv2from PIL importImage

img= cv2.imread(r"F:\DailyPractice\AffectiveComputing\ck+_dataset\1_17_0.png")

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

img= Image.open(r"F:\DailyPractice\AffectiveComputing\ck+_dataset\1_17_0.png")print(img.mode)

結果如下:

RGBA

(2)

importcv2from PIL importImage

img= cv2.imread(r"----.jpg")

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

img= Image.open(r"----.jpg"")

print(img.mode)

報錯資訊如下:

Traceback (most recent call last):

File"(此處為目前運作腳本名稱及路徑,已被删除)", line 122, in b, g, r, _=cv2.split(img)

ValueError:not enough values to unpack (expected 4, got 3)

報錯提示 cv2.split(img)隻傳回三個傳回參數,但是‘=’左邊卻有四個接收變量。而(1)是正确的,故 cv2.imread(r"----.jpg")對于RGBA圖像隻讀取了BGR三個通道。

參考文獻

【1】https://www.cnblogs.com/lyrichu/p/9124504.html