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

2021-07-09 09:12:40 字數 3290 閱讀 8430

邊緣(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 拉普拉斯運算元

邊緣 edge 是指影象區域性強度變化最顯著的部分。主要存在於目標與目標 目標與背景 區域與區域 包括不同色彩 之間,是影象分割 紋理特徵和形狀特徵等影象分析的重要基礎。影象強度的顯著變化可分為 影象的邊緣有方向和幅度兩個屬性,沿邊緣方向畫素變化平緩,垂直於邊緣方向畫素變化劇烈.邊緣上的這種變化可以...

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

邊緣 edge 是指影象區域性強度變化最顯著的部分。主要存在於目標與目標 目標與背景 區域與區域 包括不同色彩 之間,是影象分割 紋理特徵和形狀特徵等影象分析的重要基礎。影象強度的顯著變化可分為 影象的邊緣有方向和幅度兩個屬性,沿邊緣方向畫素變化平緩,垂直於邊緣方向畫素變化劇烈.邊緣上的這種變化可以...

拉普拉斯邊緣檢測 邊緣檢測演算法1 拉普拉斯運算元

拉普拉斯運算元,是學影象處理最先學習的,是乙個二階差分演算法。一階差分運算元,就是 相鄰畫素相減。二階差分運算元,就是 在 一階差分運算元上,繼續做相鄰畫素相減。三階差分運算元,就是在 二階差分上,繼續差分 所以,比較容易理解。opencv裡面,提供了乙個 laplace api 由api描述,該實...