cv2.imread 和PIL 用法彙總及區別
區別:https://blog.csdn.net/weixin_42213622/article/details/109110140
1、cv2.imread()讀取的是影象的真實資料。Image.open()函式只是保持了影象被讀取的狀態,但是影象的真實資料並未被讀取,因此如果對需要操作影象每個元素,如輸出某個畫素的RGB值等,需要執行物件的load()方法讀取資料
2、Image.open()得到的img資料型別呢是Image物件,不是普通的陣列。
cv2.imread()得到的img資料型別是np.array()型別。
3、對於Image.open()函式預設彩色影象讀取通道的順序為RGB,而cv2.imread()讀取通道的順序為BGR。同時,當影象格式為RGBA時,Image.open(‘—.jpg’)讀取的格式為RGBA(其中A表示影象的alpha通道,即RGBA共四個通道),而cv2.imread(’—.jpg’)讀取的格式是BGR,只有三個通道。
通過使用cv2.split(img)可得到cv2.imread()讀取的圖片img的BGR通道值。即使圖片是RGBA四通道,cv2.imread()方法仍然讀取的是BGR三通道。
相互轉換:
#1.Image物件->cv2(np.adarray) img = Image.open(path) img_array = np.array(img) #2.cv2(np.adarray)->Image物件 img = cv2.imread(path) img_Image = Image.fromarray(np.uint8(img))
opencv用法:
一、讀入影象
使用函式cv2.imread(filepath,flags)讀入一副圖片。
- filepath:要讀入圖片的完整路徑
- flags:讀入圖片的標誌
- cv2.IMREAD_COLOR:預設引數,讀入一副彩色圖片,忽略alpha通道
- cv2.IMREAD_GRAYSCALE:讀入灰度圖片
- cv2.IMREAD_UNCHANGED:顧名思義,讀入完整圖片,包括alpha通道
import numpy as np
import cv2
img = cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE)
二、顯示影象
使用函式cv2.imshow(wname,img)顯示影象,第一個引數是顯示影象的視窗的名字,第二個引數是要顯示的影象(imread讀入的影象),視窗大小自動調整為圖片大小。
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows() #dv2.destroyWindow(wname)
cv2.waitKey顧名思義等待鍵盤輸入,單位為毫秒,即等待指定的毫秒數看是否有鍵盤輸入,若在等待時間內按下任意鍵則返回按鍵的ASCII碼,程式繼續執行。若沒有按下任何鍵,超時後返回-1。引數為0表示無限等待。不呼叫waitKey的話,視窗會一閃而逝,看不到顯示的圖片。
cv2.destroyAllWindow()銷燬所有視窗
cv2.destroyWindow(wname)銷燬指定視窗
三、儲存影象
使用函式cv2.imwrite(file,img,num)儲存一個影象。第一個引數是要儲存的檔名,第二個引數是要儲存的影象。可選的第三個引數,它針對特定的格式:對於JPEG,其表示的是影象的質量,用0 - 100的整數表示,預設95;對於png ,第三個引數表示的是壓縮級別,預設為3。
注意:
cv2.IMWRITE_JPEG_QUALITY型別為 long,必須轉換成 int。
cv2.IMWRITE_PNG_COMPRESSION,從0到9 壓縮級別越高影象越小。
cv2.imwrite('1.png',img, [int(cv2.IMWRITE_JPEG_QUALITY), 95])
cv2.imwrite('1.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])