1. 程式人生 > >邊緣檢測演算法——影象處理

邊緣檢測演算法——影象處理

1.Sobel邊緣檢測演算法

sobel邊緣運算元認不同為鄰域的畫素對當前畫素產生的影響不是等價的,所以距離不同的畫素具有不同的權值,對運算元結果產生的影響也不同。一般來說,距離越大,產生的影響越小。這兩個卷積因子分別對垂直邊緣和水平邊緣影響最大,兩個卷積的最大值做為該點的輸出位。


該運算元包含兩組3*3的矩陣,分別為影象橫向及縱向,將之與影象作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。如果以A代表原始影象,Gx及Gy分別代表經橫向及縱向邊緣檢測的影象灰度值,其公式如下:


具體計算如下:


其中f(a,b)表示影象(a,b)點的灰度值;

影象的每一個畫素的橫向及縱向灰度值通過以下公式結合,來計算該點灰度的大小:


通常,為了提高效率,使用不開平方的近似值:


如果梯度G大於某一閾值,則認為改點(x,y)為邊緣點。

然後可用以下公式計算梯度方向:


sobel運算元根據畫素點上下、左右鄰點灰度加權差,在邊緣處達到極值這一現象檢測邊緣。對噪聲具有平滑作用,提供較為精確的邊緣方向資訊,邊緣定位精度不夠高。當對精度要求不是很高時,是一種較為常見的邊緣檢測方法。

程式碼:

void Sobel(unsigned char *pSource, unsigned char *pDst)
{
	int				i,j,Gx,Gy,nSum;
	unsigned char	*pDs1,*pDs2,*pDs3,*pDs4,*pDst5,*pDst6,*pDst7,*pDst8,*pDst9,*pResut;
	memset(pDst,0,sizeof(unsigned char)*m_nWidth*m_nHeight);
	pDs1 = pSource;
	pDs2 = pDs1+1;
	pDs3 = pDs2+1;
	pDs4 = pSource+m_nWidth;
	pDst5 = pDs4+1;
	pDst6 = pDst5+1;
	pDst7 = pSource+2*m_nWidth;
	pDst8 = pDst7+1;
	pDst9 = pDst8+1;
	pResut = pDst+m_nWidth+1;

	for (i=1;i<m_nHeight-1;i++)
	{
		for (j=1;j<m_nWidth-1;j++)
		{
			Gx = (*pDs3)+2*(*pDst6)+(*pDst9)
				-(*pDst7)-(*pDs1)-2*(*pDs4);
			Gy = (*pDs1)+2*(*pDs2)+(*pDs3)
				-(*pDst7)-2*(*pDst8)-(*pDst9);
			nSum = abs(Gx)+abs(Gy);
			*pResut = nSum>175?255:0;
			pDs1++;
			pDs2++;
			pDs3++;
			pDs4++;
			pDst5++;
			pDst6++;
			pDst7++;
			pDst8++;
			pDst9++;
			pResut++;
		}
		pDs1+=2;
		pDs2+=2;
		pDs3+=2;
		pDs4+=2;
		pDst5+=2;
		pDst6+=2;
		pDst7+=2;
		pDst8+=2;
		pDst9+=2;
		pResut+=2;
	}
}

2.Robert運算元——無方向一階銳化


3.Priwitt運算元——無方向一階銳化

Priwitt運算元在一個方向求微分,而在另一個方向求平均,因而對噪聲相對不敏感,有抑制噪聲的作用,但是畫素平均相對於對影象的低通濾,所以Prewitt運算元對邊緣的定位不如Roberts運算元。與Sobel相比,有一定的抗干擾性,影象效果比較乾淨。


幾種方法的效果比較:

  • Sobel運算元與Priwitt演算法的思路相同,屬於同一型別,因此處理效果基本相同;
  • Roberts運算元的模板時2*2,提取資訊弱;
  • 單方向銳化經過處理之後,也可以對邊界進行增強。

4.拉普拉斯運算元

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

最終結果為:



Laplacian運算元利用二階導數資訊,具有各向同性,即與座標軸方向無關,座標軸旋轉後梯度結果不變。使得影象經過二階微分後,在邊緣處產生一個陡峭的零交叉點,根據這個對零交叉點判斷邊緣。

為了改善銳化效果,可以脫離微分的計算原理,在原有的運算元基礎上,對模板係數進行改變,獲得Laplacian變形運算元


Laplacian運算元對噪聲比較敏感,Laplacian運算元有一個缺點是它對影象中的某些邊緣產生雙重響應。所以影象一般先經過平滑處理,通常把Laplacian運算元和平滑運算元結合起來生成一個新的模板。