Scharr函式和Sobel函式的混合使用

2021-08-28 08:43:44 字數 3025 閱讀 6487

**如下:

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/highgui/highgui.hpp"

#include #include using namespace cv;

/** @function main */

int main( int argc, char** argv )

imshow("原始影象",src);

gaussianblur( src, src, size(3,3), 0, 0, border_default ); //blur降噪

/// 轉換為灰度圖

cvtcolor( src, src_gray, cv_rgb2gray );

/// 建立顯示視窗

namedwindow( window_name, cv_window_autosize );

/// 建立 grad_x 和 grad_y 矩陣

mat grad_x, grad_y;

mat abs_grad_x, abs_grad_y;

//scharr函式與sobel函式一樣快,但結果更加的精確

/// 求 x方向梯度 scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, border_default ); ksize預設為3 相等於 1,0,3 scale和delta預設 1,0,

scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, border_default );

// sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, border_default );

convertscaleabs( grad_x, abs_grad_x );

imshow("x方向sobel",abs_grad_x );

/// 求y方向梯度

scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, border_default );

// sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, border_default );

convertscaleabs( grad_y, abs_grad_y );

imshow("y方向sobel", abs_grad_y);

/// 合併梯度(近似)

addweighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );

imshow("整體方向sobel", grad);

waitkey(0);

return 0;

}

1.首先申明變數:

mat src, src_gray;

mat grad;

char* window_name = 「sobel demo - ****** edge detector」;

int scale = 1;

int delta = 0;

int ddepth = cv_16s;

2.裝載原影象 src:

src = imread( argv[1] );

if( !src.data )

3.第一步對原影象使用 gaussianblur 降噪 ( 核心大小 = 3 )

gaussianblur( src, src, size(3,3), 0, 0, border_default );

4.將降噪後的影象轉換為灰度圖:

cvtcolor( src, src_gray, cv_rgb2gray );

5.第二步,在 x 和 y 方向分別」求導「。 為此,我們使用函式 sobel :

mat grad_x, grad_y;

mat abs_grad_x, abs_grad_y;

/// 求 x方向梯度

sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, border_default );

/// 求 y方向梯度

sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, border_default );

該函式接受了以下引數:

src_gray: 在本例中為輸入影象,元素型別 cv_8u

grad_x/grad_y: 輸出影象.

ddepth: 輸出影象的深度,設定為 cv_16s 避免外溢。

x_order: x 方向求導的階數。

y_order: y 方向求導的階數。

scale, delta 和 border_default: 使用預設值

注意為了在 x 方向求導我們使用: x_= 1 , y_ = 0. 採用同樣方法在 y 方向求導。

6.將中間結果轉換到 cv_8u:

convertscaleabs( grad_x, abs_grad_x );

convertscaleabs( grad_y, abs_grad_y );

7.將兩個方向的梯度相加來求取近似 梯度 (注意這裡沒有準確的計算,但是對我們來講已經足夠了)。

addweighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );

最後,顯示結果:

imshow( window_name, grad );

測試結果如下

1.sobel運算元的使用 x y 整體方向上的sobel

2.使用scharr函式 x,y,整體方向上類似sobel

getopt函式和getopt long函式

預備知識 1.getopt getopt在unix下的命令列程式特別好用,特別是在你有許多引數要加入時。表頭檔案 i nclude 函式宣告 int getopt int argc,char const argv,const char optstring 函式說明 getopt 用來分析命令列引數。...

hextoraw函式和rawtohex函式

介紹下兩個函式的作用 hextoraw 十六進製制字串轉換為raw rawtohex 將raw串轉換為十六進製制 先來看下hextoraw 函式,當出現比f大的字母時 以a最小z最大 就會報錯 正確結果 sys orcl select hextoraw abcdef from dual hextor...

hextoraw函式和rawtohex函式

介紹下兩個函式的作用 hextoraw 十六進製制字串轉換為raw rawtohex 將raw串轉換為十六進製制 先來看下hextoraw 函式,當出現比f大的字母時 以a最小z最大 就會報錯 正確結果 sys orcl select hextoraw abcdef from dual hextor...