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

影像入門

一、讀取影像

在opencv中使用cv.imread(filename, flags)函數讀取影像。filename參數表示讀取影像的路徑。讀取影像的路徑應完整給出,且不能含有中文,否則在調用cv.show()函數顯示圖片時會顯示以下錯誤:

第二個參數是一個flag,表示讀取影像的方式,分別是:

  • cv.IMREAD_COLOR: 載入彩色影像。任何影像的透明度都會被忽視。它是默認標誌
  • cv.IMREAD_GRAYSCALE:以灰度模式載入影像
  • cv.IMREAD_UNCHANGED:載入影像,包括alpha通道

image

除了這三種讀取方式,還可以分別用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)

image

注意看中間和最右側的圖片並沒什麼肉眼可見的差異,但實際上以cv.IMREAD_UNCHANGED方式讀取影像會包含alpha通道,即載入一張圖片的透明和半透明度。

二、顯示影像

使用函數cv.imshow(winname, mat)在窗口中顯示影像。窗口自動適合影像尺寸。

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

程式碼如下:

img = cv2.imread('../../../datasets/image/cat.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

image

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()

image

三、保存影像

保存影像,用這個函數cv.imwrite(filename, img)

第一個參數是文件名,第二個參數是你要保存的影像。

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

如果影像保存成功,會返回一下結果:

image

來讓影像顯示一下:

img = cv2.imread('../../../datasets/image/cat_gray.jpg')
cv_show('img', img)

image

四、總結

在下面的程式中,以灰度載入影像,顯示影像,按 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種顏色。

image

  • 灰度影像:有不同深度的灰色和黑白兩色。三個通道的數值一樣。

image

  • 二值影像:非黑即白,即只有黑色和白色,表現在像素上就是只有0和255。

image

  • 偽彩色影像:偽彩色影像的每個像素值實際上是一個索引值或程式碼,該程式碼值作為色彩查找表中某一項的入口地址,根據該地址可查找出包含實際R、G、B的強度值。這種用查找映射的方法產生的色彩稱為偽彩色,生成的影像為偽彩色影像。

image

  • 色彩豐富程度:彩色影像>偽彩色影像>灰度影像>二值影像