圖像的載入:imread()函數
imread()函數可以用來非常便捷地讀取文件中的圖片到Opencv中。這個函數一般需要兩個參數:
(1)載入圖片的路徑名。如果圖像文件在工程文件夾下,可以直接用文件名讀取,如“cat.jpg”,否則需要輸入完整的訪問路徑,如“D:\\test\\lena.png”。這裏還有幾個tips:
-
imread函數中,一個點代表省略當前文件夾路徑,兩個點則代表回到上一個文件夾路徑。
-
通常可以通過以下方式獲得圖片的路徑:在圖片上右鍵——屬性——安全——對象名稱,如下圖所示。但是需要注意,OpenCV的imread()不支持單右斜線形式的路徑。但是,可以支持其他斜線形式都,比如雙右斜線、雙左斜線、單左斜線或前述三種斜線組成的混合型形式!!
(2)int 類型的 flags,即載入標記,用於指定加載圖像的顏色類型,其默認值爲1,表示載入三通道的彩色圖像。常用的標識符解釋如下:
- cv.IMREAD_UNCHANGED,等價取值爲-1,載入無損的原圖像,包括alpha通道;
- cv.IMREAD_GRAYSCALE,等價取值爲0,以灰度模式加載圖像;
- cv.IMREAS_COLOR,默認標誌,等價取值爲1,加載彩色圖像。圖像的透明度都將被忽略。
圖像的顯示:imshow()函數
使用函數cv.imshow() 在窗口中顯示圖像,該函數同樣需要兩個參數:
(1)winname,窗口標識名稱。
(2)填所需要顯示的圖像。
在我們直接使用 cv.imshow() 函數時,創建出來的窗口往往是“一瞬即逝”的。我們需要用 cv.waitKey() 來“維持”窗口。cv.waitKey() 具有鍵盤綁定功能,它的參數是時間(以毫秒爲單位)。該函數將爲任何鍵盤事件等待指定的毫秒數。如果在此期間按任意鍵,程序將繼續。如果傳遞 0,它將無限期地等待擊鍵。我們還可以將其設置爲檢測特定的按鍵,例如是否按下了按鍵q或Esc(ASCII碼爲27)。最後,還需要通過cv.destroyAllWindows()或cv.destroyWindow() 銷燬創建出的窗口,釋放出相應的內存空間。cv.destoryAllWindows()會銷燬創建的所有窗口,如果要銷燬指定的窗口,可以使用cv.destroyWindow()函數,在其中傳遞確切的窗口名稱作爲參數。
#代碼示例
import cv2 as cv
img = cv.imread('cat.jpg',cv.IMREAD_GRAYSCALE)
cv.imshow('image',img)
#以下三種方式爲並列關係,僅爲解釋cv.waitKey()函數用法
#無限等待等待任意鍵盤輸入
cv.waitKey(0)
cv.destroyAllWindows()
#窗口顯示1s(1s=1000ms)後關閉
cv.waitKey(1000)
cv.destroyAllWindows()
#等待按q鍵則返回
if cv2.waitKey(0) & 0xFF == ord('q'):
cv.destroyAllWindows()
我們也可以在加載圖像之前,指定創建出的窗口性質。在這種情況下,我們會用到cv.namedWindow()函數。該函數除了需要傳入窗口名稱之外,還需要一個窗口標識,有如下幾種選擇:
- cv.WINDOW_NORMAL,在此設置下,用戶可以任意改變窗口大小;
- cv.WINDOW_AUTOSIZE,在此設置下,窗口大小會自動調整以適應顯示的圖像,用戶不能手動改變窗口大小;
- cv.WINDOW_OPENGL,在此設置下,窗口創建時可以支持OpenGL。
namedWindow()函數的第二個參數有默認值WINDOW_AUTOSIZE。
輸出圖像文件:imwrite()函數
OpenCV中,輸出圖像到文件一般採用 imwrite() 函數,該函數需要三個參數:
(1)帶後綴的文件名,如“123.jpg”。
(2)需要輸出的圖像名稱。
(3)用於改變圖片質量的特定格式保存的參數編碼,一般情況下不需要填寫。
綜合練習
import cv2 as cv
#使用函數cv.imread()讀取圖像。
image = cv.imread('lena.jpg',cv.IMREAD_GRAYSCALE)
#使用函數cv.imshow()在窗口中顯示圖像。
image_1 = cv.imread('lena.jpg')
cv.namedWindow('lena', cv.WINDOW_NORMAL) # cv.WINDOW_NORMAL可調整圖片顯示大小
cv.imshow("lena", image_1)
k = cv.waitKey(0)
#Esc鍵退出
if k == 27:
cv.destroyAllWindows()
#s鍵保存
elif k == ord("s"):
cv.imwrite("lena_new.jpg",image_1)
cv.destroyAllWindows()
參考:
https://docs.opencv.org/4.1.1/dc/d2e/tutorial_py_image_display.html
《OpenCV3編程入門》