邊緣(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描述,該實...