边缘检测算法——图像处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guanyuqiu/article/details/52993412

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算子和平滑算子结合起来生成一个新的模板。





猜你喜欢

转载自blog.csdn.net/guanyuqiu/article/details/52993412