目标
在這裡,你将學習如何讀取圖像,如何顯示圖像以及如何将其儲存回去
你将學習以下功能:cv.imread(),cv.imshow(),cv.imwrite()
(可選)你将學習如何使用Matplotlib顯示圖像
使用OpenCV
讀取圖像
使用cv.imread()函數讀取圖像。圖像應該在工作目錄或圖像的完整路徑應給出。
第二個參數是一個标志,它指定了讀取圖像的方式。
cv.IMREAD_COLOR: 加載彩色圖像。任何圖像的透明度都會被忽視。它是預設标志。
cv.IMREAD_GRAYSCALE:以灰階模式加載圖像
cv.IMREAD_UNCHANGED:加載圖像,包括alpha通道
注意
除了這三個标志,你可以分别簡單地傳遞整數1、0或-1。
請參見下面的代碼:
import numpy as np
import cv2 as cv
#加載彩色灰階圖像
img = cv.imread('messi5.jpg',0)複制代碼
警告
即使圖像路徑錯誤,它也不會引發任何錯誤,但是print img會給出None
顯示圖像
使用函數cv.imshow()在視窗中顯示圖像。視窗自動适合圖像尺寸。
第一個參數是視窗名稱,它是一個字元串。第二個參數是我們的對象。你可以根據需要建立任意多個視窗,但可以使用不同的視窗名稱。
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()複制代碼
視窗的螢幕截圖如下所示(在Fedora-Gnome機器中):
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauQ3boNnblVmcjN3X2NmblB3bvwFdl5mLzJWdolWYuUXaulWcvw1LcpDc0RHaiojIsJye.jpg)
cv.waitKey()是一個鍵盤綁定函數。其參數是以毫秒為機關的時間。該函數等待任何鍵盤事件指定的毫秒。如果您在這段時間内按下任何鍵,程式将繼續運作。如果0被傳遞,它将無限期地等待一次敲擊鍵。它也可以設定為檢測特定的按鍵,例如,如果按下鍵 a 等,我們将在下面讨論。
注意
除了鍵盤綁定事件外,此功能還處理許多其他GUI事件,是以你必須使用它來實際顯示圖像。
cv.destroyAllWindows()隻會破壞我們建立的所有視窗。如果要銷毀任何特定的視窗,請使用函數 cv.destroyWindow()在其中傳遞确切的視窗名稱作為參數。
注意
在特殊情況下,你可以建立一個空視窗,然後再将圖像加載到該視窗。在這種情況下,你可以指定視窗是否可調整大小。這是通過功能cv.namedWindow()完成的。預設情況下,該标志為cv.WINDOW_AUTOSIZE。但是,如果将标志指定為cv.WINDOW_NORMAL,則可以調整視窗大小。當圖像尺寸過大以及向視窗添加跟蹤欄時,這将很有幫助。
請參見下面的代碼:
cv.namedWindow('image',cv.WINDOW_NORMAL)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()複制代碼
寫入圖像
使用函數cv.imwrite()儲存圖像。
第一個參數是檔案名,第二個參數是要儲存的圖像。cv.imwrite('messigray.png',img)
這會将圖像以PNG格式儲存在工作目錄中。
總結
在下面的程式中,以灰階加載圖像,顯示圖像,按s儲存圖像并退出,或者按ESC鍵直接退出而不儲存。
import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg',0)
cv.imshow('image',img)
k = cv.waitKey(0)
if k == 27: # 等待ESC退出
cv.destroyAllWindows()
elif k == ord('s'): # 等待關鍵字,儲存和退出
cv.imwrite('messigray.png',img)
cv.destroyAllWindows()複制代碼
警告
如果使用的是64位計算機,則必須k = cv.waitKey(0)按如下所示修改行:k = cv.waitKey(0) & 0xFF
使用Matplotlib
Matplotlib是Python的繪圖庫,可為你提供多種繪圖方法。你将在接下來的文章中看到它們。在這裡,你将學習如何使用Matplotlib顯示圖像。你可以使用Matplotlib縮放圖像,儲存圖像等。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # 隐藏 x 軸和 y 軸上的刻度值
plt.show()複制代碼
視窗的螢幕截圖如下所示:
還可以看看
Matplotlib中提供了許多繪圖選項。請參考Matplotlib文檔以擷取更多詳細資訊。一些,我們将在路上看到。
警告
OpenCV加載的彩色圖像處于BGR模式。但是Matplotlib以RGB模式顯示。是以,如果使用OpenCV讀取彩色圖像,則Matplotlib中将無法正确顯示彩色圖像。有關更多詳細資訊,請參見練習。
其他資源
Matplotlib繪圖樣式和功能:http://matplotlib.org/api/pyplot_api.html
練習題
當你嘗試在OpenCV中加載彩色圖像并将其顯示在Matplotlib中時,存在一些問題。閱讀此讨論:http://stackoverflow.com/a/15074748/1134940)并了解它。