OpenCV 邊緣檢測 Sobel 拉普拉斯運算元

2021-07-10 15:23:43 字數 3282 閱讀 1212

邊緣(edge)是指影象區域性強度變化最顯著的部分。主要存在於目標與目標、目標與背景、區域與區域(包括不同色彩)之間,是影象分割、紋理特徵和形狀特徵等影象分析的重要基礎。

影象強度的顯著變化可分為:

影象的邊緣有方向和幅度兩個屬性,沿邊緣方向畫素變化平緩,垂直於邊緣方向畫素變化劇烈.邊緣上的這種變化可以用微分運算元檢測出來,通常用一階或二階導數來檢測邊緣。

(a)(b)分別是階躍函式和屋頂函式的二維影象;(c)(d)是階躍和屋頂函式的函式圖象;(e)(f)對應一階倒數;(g)(h)是二階倒數。

對於左圖,左側的邊是正的(由暗到亮),右側的邊是負的(由亮到暗)。對於右圖,結論相反。常數部分為零。用來檢測邊是否存在。

函式f(x,y)在(x,y)處的梯度為乙個向量:

計算這個向量的大小為:

近似為:

梯度的方向角為:

sobel運算元的表示:

梯度幅值:

用卷積模板來實現:

介面[cpp]view plain

copy

cv_exports_w 

void

sobel( inputarray src, outputarray dst, 

intddepth,  

intdx, 

intdy, 

intksize=3,  

double

scale=1, 

double

delta=0,  

intbordertype=border_default );   使用

[cpp]view plain

copy

/// sobe l

/// generate grad_x and grad_y

mat grad_x, grad_y;  

mat abs_grad_x, abs_grad_y;  

/// gradient x

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

//calculates the first, second, third, or mixed image derivatives using an extended sobel operator.

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

convertscaleabs( grad_x, abs_grad_x );  

/// gradient 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 );  

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

二階微分在亮的一邊是負的,在暗的一邊是正的。常數部分為零。可以用來確定邊的準確位置,以及畫素在亮的一側還是暗的一側。

二維函式f(x,y)的拉普拉斯是乙個二階的微分,定義為:

其中:

可以用多種方式將其表示為數字形式。對於乙個3*3的區域,經驗上被推薦最多的形式是:

定義數字形式的拉普拉斯要求係數之和必為0

介面[cpp]view plain

copy

cv_exports_w 

void

laplacian( inputarray src, outputarray dst, 

intddepth,  

intksize=1, 

double

scale=1, 

double

delta=0,  

intbordertype=border_default );   使用

[cpp]view plain

copy

mat abs_dst,dst;  

intscale = 1;  

intdelta = 0;  

intddepth = cv_16s;  

intkernel_size = 3;   

laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, border_default );  

convertscaleabs( dst, abs_dst );  

namedwindow( window_name2, cv_window_autosize );   原圖

注意,邊緣檢測對雜訊比較敏感,需要先用高斯濾波器對影象進行平滑。參考博文:【opencv】鄰域濾波:方框、高斯、中值、雙邊濾波

sobel運算元可以直接計算gx 、gy可以檢測到邊的存在,以及從暗到亮,從亮到暗的變化。僅計算| gx |,產生最強的響應是正交 於x軸的邊; | gy |則是正交於y軸的邊。

拉普拉斯對雜訊敏感,會產生雙邊效果。不能檢測出邊的方向。通常不直接用於邊的檢測,只起輔助的角色,檢測乙個畫素是在邊的亮的一邊還是暗的一邊利用零跨越,確定邊的位置。

Opencv之邊緣檢測Sobel濾波

一 sobel函式 二 對垂直 水平方向邊緣檢測 三 對垂直和水平方向邊緣檢測 利用sobel方法可以進行sobel邊緣檢測 sobelx cv2.sobel img,cv2.cv 64f,1,0,ksize 3 img表示源影象,即進行邊緣檢測的影象 cv2.cv 64f表示64位浮點數即64fl...

Opencv學習 邊緣檢測(sobel運算元)

sobel運算元是乙個主要用於邊緣檢測的離散微分運算元。它結合了高斯平滑和微分求導,用來計算灰度函式的近似梯度。void sobel inputarray src,outputarray dst,int ddepth,int dx,int dy,int ksize 3,double scale 1,...

Sobel 邊緣檢測

sobel邊緣檢測演算法 索貝爾運算元 sobel operator 主要用作邊緣檢測,在技術上,它是一離散性差分運算元,用來運算影象亮度函式的灰度之近似值。在影象的任何一點使用此運算元,將會產生對應的灰度向量或是其法向量 sobel 卷積因子為 該運算元包含兩組 3x3的矩陣,分別為橫向及縱向,將...