邊緣(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, int ddepth,
int dx, int dy, int ksize=3,
double scale=1, double delta=0,
int bordertype=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)的拉普拉斯是乙個二階的微分,定義為:
其中:
定義數字形式的拉普拉斯要求係數之和必為0
介面[cpp]view plain
copy
cv_exports_w void laplacian( inputarray src, outputarray dst, int ddepth,
int ksize=1, double scale=1, double delta=0,
int bordertype=border_default );
使用[cpp]view plain
copy
mat abs_dst,dst;
int scale = 1;
int delta = 0;
int ddepth = cv_16s;
int kernel_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的矩陣,分別為橫向及縱向,將...