OpenCV4系列之圖像梯度


在圖像處理中,求解圖像梯度是常用操作。

Sobel算子

Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator.

Sobel 算子是一種離散性差分算子,用來計算圖像像素值的一階、二階、三階或混合梯度。在圖像的任何一點使用此算子,將會產生對應的灰度矢量或是其法矢量。

C++: void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT )
C: void cvSobel(const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 )

參數含義

src – 輸入圖像

dst – 輸出結果,與輸入圖像具有相同的尺寸和通道數

ddepth – 輸出圖像的數據類型。支持以下數據類型組合

  • src.depth() = CV_8U, ddepth = -1/CV_16S/CV_32F/CV_64F
  • src.depth() = CV_16U/CV_16S, ddepth = -1/CV_32F/CV_64F
  • src.depth() = CV_32F, ddepth = -1/CV_32F/CV_64F
  • src.depth() = CV_64F, ddepth = -1/CV_64F

當ddepth=-1時,輸出與輸入具有相同的數據類型。當輸入是8比特圖像時,輸出結果將是截斷的導數值(in the case of 8-bit input images it will result in truncated derivatives)。

xorder – x方向求導階數

yorder – y方向求導階數

ksize – 卷積核的大小,只能是1/3/5/7之一(it must be 1, 3, 5, or 7)。

scale – 縮放尺度因子,默認無縮放

delta – 存儲之前加到上述結果上的偏移量。

borderType – 邊界插值方法,詳見附錄A-1。

 

Scharr算子

Calculates the first x- or y- image derivative using Scharr operator.

該算子參數和 Sobel 算子一致,與 Sobel 區別在於,Scharr 僅作用於大小為3的內核。具有和sobel算子一樣的速度,但結果更為精確。

C++: void Scharr(InputArray src, OutputArray dst, int ddepth, int dx, int dy, double scale=1, double delta=0, int borderType=BORDER_DEFAULT )

參數含義

src – 輸入圖像

dst – 輸出結果,與輸入圖像具有相同的尺寸和通道數

ddepth – 輸出圖像的數據類型,即矩陣中元素的一個通道的數據類型,這個值和 type 是相關的。例如 type 為 CV_16SC2,一個2通道的16位的有符號整數,depth是CV_16S

dx – dx=1 表示求 x 方向的一階梯度,dx=0 表示不求 x 方向

dy – 與上類似,dy=1 表示求 y 方向的一階梯度,dy=0 表示不求 y 方向

scale – 求導得到的值的縮放尺度因子,默認無縮放

delta – 在存儲之前加到求導值上的數值,可以用於將0以下的值調整到0以上。delta=0 時表示梯度為0處結果保存為0;delta=m 時表示梯度為0處結果保存為m

borderType – 表示圖像四周像素外插值方法,默認是 BORDER_DEFAULT,該參數解釋見附錄A-1。

 

附錄A-1

borderType

決定在圖像發生幾何變換或者濾波操作(卷積)時邊沿像素的處理方式

/*
 Various border types, image boundaries are denoted with '|'

 * BORDER_REPLICATE:     aaaaaa|abcdefgh|hhhhhhh
 * BORDER_REFLECT:       fedcba|abcdefgh|hgfedcb
 * BORDER_REFLECT_101:   gfedcb|abcdefgh|gfedcba
 * BORDER_WRAP:          cdefgh|abcdefgh|abcdefg
 * BORDER_CONSTANT:      iiiiii|abcdefgh|iiiiiii  with some specified 'i'
 */
  • BORDER_CONSTANT 邊沿像素用 i 擴展,需要設置borderValue 指定 ' i ' 值,const cv::Scalar& borderValue = cv::Scalar(0);
  • BORDER_REPLICATE,復制邊界像素
  • BORDER_REFLECT,對邊界對稱擴展,包含對稱軸處的元素
  • BORDER_REFLECT_101,以邊界為對稱軸對稱擴展復制像素,不包含對稱軸處的元素

 

cv::Mat 的屬性

The class Mat represents an n-dimensional dense numerical single-channel or multi-channel array.
It can be used to store real or complex-valued vectors and matrices, grayscale or color images, voxel
volumes, vector fields, point clouds, tensors, histograms (though, very high-dimensional histograms
may be better stored in a SparseMat ).

Mat是用於表示一個多維的單通道或者多通道的稠密數組。能用來保存實數或復數的向量、矩陣,灰度或彩色圖像,立體元素,點雲,張量以及直方圖(高維的直方圖最好使用SparseMat保存)。總之Mat就是用來保存多維的矩陣的。

  • depth

depth屬性表示矩陣中元素的一個通道的數據類型。可以根據矩陣的 type 屬性來判斷( S 代表 signed int,即有符號整形;U 代表 unsigned int,即無符號整形;F 代表 float,即單精度浮點型。):

對於 CV_8U/CV_8S 其 depth 為 1

對於 CV_16U/CV_16S 其 depth 為 2

對於 CV_32S/CV_32F 其 depth 為 4

對於 CV_64F 其depth 為 8

#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))

#define CV_8SC1 CV_MAKETYPE(CV_8S,1)
#define CV_8SC2 CV_MAKETYPE(CV_8S,2)
#define CV_8SC3 CV_MAKETYPE(CV_8S,3)
#define CV_8SC4 CV_MAKETYPE(CV_8S,4)
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))

#define CV_16UC1 CV_MAKETYPE(CV_16U,1)
#define CV_16UC2 CV_MAKETYPE(CV_16U,2)
#define CV_16UC3 CV_MAKETYPE(CV_16U,3)
#define CV_16UC4 CV_MAKETYPE(CV_16U,4)
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))

#define CV_16SC1 CV_MAKETYPE(CV_16S,1)
#define CV_16SC2 CV_MAKETYPE(CV_16S,2)
#define CV_16SC3 CV_MAKETYPE(CV_16S,3)
#define CV_16SC4 CV_MAKETYPE(CV_16S,4)
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))

#define CV_32SC1 CV_MAKETYPE(CV_32S,1)
#define CV_32SC2 CV_MAKETYPE(CV_32S,2)
#define CV_32SC3 CV_MAKETYPE(CV_32S,3)
#define CV_32SC4 CV_MAKETYPE(CV_32S,4)
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))

#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))

#define CV_64FC1 CV_MAKETYPE(CV_64F,1)
#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
type definition

參考資料

[1] Image Filtering

[2] OpenCV2:Mat屬性type,depth,step

[3] Sobel Derivatives

[4] opencv邊緣檢測sobel算子

[5] python opencv學習(六)圖像梯度計算


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM