OpenCV-Python教程001——圖像的讀取、顯示和保存

目標:在本部分內容,您將學習如何讀取圖像、如何顯示圖像以及如何將其保存起來。

您將學習以下函數:cv2.imread()、cv2.imshow()、cv2.imwrite()。

(1)使用OpenCV讀取圖像

使用函數cv2.imread()讀取圖像。映像應該在工作目錄中,或者應該給出映像的完整路徑。

第二個參數是一個標誌,指定讀取圖像的方式。

cv2.IMREAD_COLOR:加載彩色圖像。任何圖像的透明度都將被忽略。它是默認標誌。

cv2.IMREAD_GRAYSCALE:以灰度模式加載圖像。

cv2.IMREAD_UNCHANGED:加載圖像,包括alpha通道。

注意,您只需分別傳遞整數1、0或-1,而不是這三個標誌。

請參見下面的代碼:

<code>import numpy as np
import cv2
img = cv2.imread('D:/python_opencv/images/lena.png',cv2.IMREAD_UNCHANGED)/<code>

(2)顯示圖像

使用函數cv2.imshow()在窗口中顯示圖像。窗口自動適應圖像大小。

第一個參數是一個窗口名,它是一個字符串。第二個參數是我們的圖像。您可以創建任意多個窗口,但使用不同的窗口名。

<code>cv2.imshow('image',img) #窗口名字,要顯示的圖像
cv2.waitKey(0) #無限等待,直到任意鍵按下
cv2.destroyAllWindows() #銷燬所有窗口/<code>

圖像顯示如下:

OpenCV-Python教程001——圖像的讀取、顯示和保存

waitKey()是一個鍵盤綁定函數。它的參數是以毫秒為單位的時間。該函數等待指定的毫秒,等待任何鍵盤事件。如果在該時間按任何鍵,程序將繼續。如果0被傳遞,它將無限期地等待一個鍵按下。它還可以設置為檢測特定的按鍵按下,例如,如果按下a鍵等,我們將在下面討論。

注意除了綁定鍵盤事件之外,這個函數還處理許多其他的GUI事件,因此您必須使用它來實際顯示圖像。

destroyAllWindows()只會銷燬我們創建的所有窗口。如果要銷燬任何特定窗口,請使用函數cv2.destroyWindow(),在該函數中將確切的窗口名稱作為參數傳遞。

注意,有一種特殊情況,您可以在其中創建一個窗口,然後將圖像加載到該窗口。在這種情況下,可以指定窗口是否可調整大小。它是用函數cv2.namedWindow()完成的。默認情況下,標誌為cv2.WINDOW_AUTOSIZE。但是,如果將標誌指定為cv2.WINDOW_NORMAL,則可以調整窗口大小。當圖像尺寸太大並在窗口中添加軌跡欄時,這將非常有用。

請參見下面的代碼:

<code>#cv2.WINDOW_NORMAL,可以調整窗口大小
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image',img)

cv2.waitKey(0)
cv2.destroyAllWindows()/<code>

圖像顯示如下,圖中通過鼠標拖動人為改變了圖像的形狀。

OpenCV-Python教程001——圖像的讀取、顯示和保存

(3)寫一幅圖像

使用函數cv2.imwrite()保存圖像。

第一個參數是文件名,第二個參數是要保存的圖像。以下代碼將上面讀取的圖像橫向拼接並保存、讀取、顯示。

<code>img2=np.concatenate((img,img),axis=1)   #將圖像橫向拼接
cv2.imwrite('D:/python_opencv/images/lena2.jpg',img2) #保存圖像
img = cv2.imread('D:/python_opencv/images/lena2.jpg',cv2.IMREAD_COLOR)
cv2.imshow('image',img) #窗口名字,要顯示的圖像
cv2.waitKey(0) #無限等待,直到任意鍵按下
cv2.destroyAllWindows() #銷燬所有窗口/<code>
OpenCV-Python教程001——圖像的讀取、顯示和保存

(4)總結一下

下面通過一個綜合例子,以灰度加載圖像,顯示它,如果按“s”並退出,則保存圖像,如果按ESC鍵,則只需退出而不保存。

<code>#按Esc退出,按s鍵保存圖像
import numpy as np
import cv2
img = cv2.imread('D:/python_opencv/images/lena.png',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27: # 等待按ESC鍵退出
cv2.destroyAllWindows()
elif k == ord('s'): # 等待按's' 鍵保存並退出
cv2.imwrite('D:/python_opencv/images/lena.jpg',img)
cv2.destroyAllWindows()/<code>

圖像顯示如下:

OpenCV-Python教程001——圖像的讀取、顯示和保存

需要說明的是,如果使用64位計算機,則必須按如下方式修改k=cv2.waitKey(0)行:k=cv2.waitKey(0)&0xFF. 這樣能夠保證獲得8位的ASCII碼。

需要說明的是,OpenCV加載的彩色圖像處於BGR模式。如果您要使用其它方式如Matplotlib顯示圖像,需要將其轉換為RGB模式。否則使用OpenCV讀取的彩色圖像將無法在Matplotlib中正確顯示。我們將在後續內容中介紹顏色空間轉換的方法。


分享到:


相關文章: