OpenCV3影像處理筆記

嵌入式視覺 發表於 2022-12-04
OpenCV

此筆記針對 Python 版本的 opencv3,c++ 版本的函式和 python 版本的函式引數幾乎一樣,只是矩陣格式從 ndarray 型別變成適合 c++ 的 mat 模板型別。注意,因為 python 版本的opncv只提供介面沒有實現,故函式原型還是來自 c++版本的opencv,但是引數解釋中的資料型別還是和 python 保持一致。

影像的載入:imread() 函式

函式原型:

Mat imread(const sting& filename, int flags=None)

引數解釋:

  • filename:影像的檔案路徑,sting 字串型別
  • flags:載入標識,以何種方式讀取圖片,int 型別的 flags。常用取值解釋如下:
    • flags = 0:始終將影像轉成灰度圖再返回
    • flags = 1:始終將影像轉換成彩色圖再返回,如果讀取的是灰度圖,則其返回的矩陣 shape 將變為 (height, width, 3)
    • flags = 2:如果載入的影像深度為 16 位或者 32 位,就返回對應深度的影像,否則,就轉換為 8 點陣圖像再返回。

總結:讀取檔案中的圖片到 OpenCV 中,返回 Mat 或者 ndarray 型別的矩陣,以彩色模式載入影像時,解碼後的影像會預設以 BGR 的通道順序進行儲存。

cv2.imread()函式:

python-opencv 庫的 imread 函式的 flags 引數取值方式與 C++ 版有所區別。使用函式 cv2.imread() 讀入影像,影像要麼在此程式的工作路徑,要麼函式引數指定了完整路徑,第二個引數是要告訴函式應該如何讀取這幅圖片,取值如下:

  • cv2.IMREAD_COLOR : 取值 1,讀入一副彩色影像。影像的透明度會被忽略,這是預設引數。
  • cv2.IMREAD_GRAYSCALE : 取值 0,以灰度模式讀入影像。
  • cv2.IMREAD_UNCHANGED : 取值 -1,讀入一幅影像,並且包括影像的 alpha 通道。

Instead of these three flags, you can simply pass integers 1, 0 or -1 respectively.

import numpy as np
import cv2
# Load an color image in grayscale
img = cv2.imread('messi5.jpg',0)

opencv-python 庫的讀取影像函式 cv2.imread() 官方定義如下圖。

opencv-python庫的讀取影像函式官方定義

影像的顯示:imshow()函式

函式原型:

void imshow(const string &winname, InputArray mat)

引數解釋:

  • winname:需要顯示的視窗標識名稱,string 字串型別
  • mat:需要顯示的影像矩陣,ndarray numpy 矩陣型別

總結:imshow 函式用於在指定的視窗顯示影像,視窗會自動調整為影像大小。

minMaxLoc 函式

函式 cv :: minMaxLoc 查詢最小和最大元素值及其位置,返回的位置座標是先列號,後行號(列號,行號) 。在整個陣列中搜尋極值,或者如果mask不是空陣列,則在指定的陣列區域中搜尋極值。(只適合單通道矩陣)。函式原型:

CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal,
                            CV_OUT double* maxVal = 0, CV_OUT Point* minLoc = 0,
                            CV_OUT Point* maxLoc = 0, InputArray mask = noArray());

函式引數解釋:

  • src:input single-channel array.
  • minVal:pointer to the returned minimum value; NULL is used if not required.
  • maxVal:pointer to the returned maximum value; NULL is used if not required.
  • minLoc:pointer to the returned minimum location (in 2D case); NULL is used if not required.
  • maxLoc:pointer to the returned maximum location (in 2D case); NULL is used if not required.

位深度的概念

  • 灰度圖的位深度是 16,則其矩陣的元素型別為 uint16 ,彩色圖其位深度一般是 24 ,紅色佔 8 個位、藍色佔 8 個位、綠色佔 8 個位,其矩陣的元素型別為 uint8
  • 位解析度( Bit Resolution )又稱色彩深度、色深或位深度,在點陣圖影像或影片影片緩衝區,指一個畫素中,每個顏色分量(Red、Green、Blue、Alpha 通道)的位元數。
  • matplotlib.image.imsave 將灰度圖的矩陣儲存為影像格式時,其預設儲存的影像通道數為 4RGBA,其中 RGB 三個通道對應的二維矩陣數值完全一樣。