天天看點

opencv學習(一)——圖像入門

圖像入門

一、讀取圖像

在opencv中使用

cv.imread(filename, flags)

函數讀取圖像。

filename

參數表示讀取圖像的路徑。讀取圖像的路徑應完整給出,且不能含有中文,否則在調用

cv.show()

函數顯示圖檔時會顯示以下錯誤:

第二個參數是一個

flag

,表示讀取圖像的方式,分别是:

  • cv.IMREAD_COLOR

    : 加載彩色圖像。任何圖像的透明度都會被忽視。它是預設标志
  • cv.IMREAD_GRAYSCALE

    :以灰階模式加載圖像
  • cv.IMREAD_UNCHANGED

    :加載圖像,包括alpha通道
opencv學習(一)——圖像入門
除了這三種讀取方式,還可以分别用1、0或1表示以上三種方式

我們運作以下代碼,通過這三種模式,來看一下實際效果:

import cv2
import numpy as np

img1 = cv2.imread('../../../datasets/image/cat.jpg', 1)#加載彩色圖像
img2 = cv2.imread('../../../datasets/image/cat.jpg', 0)#加載灰階圖像
img3 = cv2.imread('../../../datasets/image/cat.jpg', -1)#加載圖像,包括alpha通道
def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
cv_show('img1_3', np.hstack((img1, img3)))
cv_show('img2', img2)
           
opencv學習(一)——圖像入門

注意看中間和最右側的圖檔并沒什麼肉眼可見的差異,但實際上以

cv.IMREAD_UNCHANGED

方式讀取圖像會包含alpha通道,即加載一張圖檔的透明和半透明度。

二、顯示圖像

使用函數

cv.imshow(winname, mat)

在視窗中顯示圖像。視窗自動适合圖像尺寸。

第一個參數是視窗名稱,它是一個字元串。第二個參數是我們的對象。你可以根據需要建立任意多個視窗,可以使用不同的視窗名稱。

代碼如下:

img = cv2.imread('../../../datasets/image/cat.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
           
opencv學習(一)——圖像入門

cv.waitKey(delay)

是一個鍵盤綁定函數。其參數是以毫秒為機關的時間。該函數等待任何鍵盤事件指定的毫秒。如果您在這段時間内按下任何鍵,程式将繼續運作。如果

delay=0

,它将無限期地等待一次敲擊鍵。它也可以設定為檢測特定的按鍵,例如,如果按下鍵 a 等,我們将在下面讨論。

除了鍵盤綁定事件外,此功能還處理許多其他GUI事件,是以你必須使用它來實際顯示圖像

cv.destroyAllWindows()

隻會破壞我們建立的所有視窗。如果要銷毀任何特定的視窗,請使用函數

cv.destroyWindow(winname)

在其中傳遞确切的視窗名稱作為參數。

在特殊情況下,你可以建立一個空視窗,然後再将圖像加載到該視窗。在這種情況下,你可以指定視窗是否可調整大小。這是通過功能

cv.namedWindow(winname, flags)

完成的。預設情況下,該标志為

cv.WINDOW_AUTOSIZE

。但是,如果将标志指定為

cv.WINDOW_NORMAL

,則可以調整視窗大小。當圖像尺寸過大以及向視窗添加跟蹤欄時,這将很有幫助。
img = cv2.imread('../../../datasets/image/cat.jpg')
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
           
opencv學習(一)——圖像入門

三、儲存圖像

儲存圖像,用這個函數

cv.imwrite(filename, img)

第一個參數是檔案名,第二個參數是你要儲存的圖像。

cv2.imwrite('../../../datasets/image/cat_gray.jpg', img2)
           

如果圖像儲存成功,會傳回一下結果:

opencv學習(一)——圖像入門

來讓圖像顯示一下:

img = cv2.imread('../../../datasets/image/cat_gray.jpg')
cv_show('img', img)
           
opencv學習(一)——圖像入門

四、總結

在下面的程式中,以灰階加載圖像,顯示圖像,按 s 儲存圖像并退出,或者按 ESC 鍵直接退出而不儲存。

img = cv2.imread('../../../datasets/image/cat.jpg', 0)
cv2.imshow('img', img)
k = cv2.waitKey(0)
if k == 27:        #等待ESC退出
    cv2.destroyAllWindows()
elif k == ord('s'):           #等待關鍵字‘s’,儲存并退出
    cv2.imwrite('../../../datasets/image/cat.png', img)
    cv2.destroyAllWindows()
           
如果你使用的是 64 位機器,你需要修改

k = cv.waitKey(0)

像這樣:

k = cv.waitKey(0) & 0xFF

五、彩色圖像、灰階圖像、二值圖像圖像和僞彩色圖像的差別

  • 彩色圖像:RGB圖像,有255 x 255 x 255種顔色。
opencv學習(一)——圖像入門
  • 灰階圖像:有不同深度的灰色和黑白兩色。三個通道的數值一樣。
  • 二值圖像:非黑即白,即隻有黑色和白色,表現在像素上就是隻有0和255。
  • 僞彩色圖像:僞彩色圖像的每個像素值實際上是一個索引值或代碼,該代碼值作為色彩查找表中某一項的入口位址,根據該位址可查找出包含實際R、G、B的強度值。這種用查找映射的方法産生的色彩稱為僞彩色,生成的圖像為僞彩色圖像。
  • 色彩豐富程度:彩色圖像>僞彩色圖像>灰階圖像>二值圖像