边缘检测

                                   
               

1.Sobel边缘检测算法

sobel边缘算子认不同为邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越大,产生的影响越小。这两个卷积因子分别对垂直边缘和水平边缘影响最大,两个卷积的最大值做为该点的输出位。

边缘检测

该算子包含两组3*3的矩阵,分别为图像横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,其公式如下:

边缘检测

具体计算如下:

边缘检测

其中f(a,b)表示图像(a,b)点的灰度值;

图像的每一个像素的横向及纵向灰度值通过以下公式结合,来计算该点灰度的大小:

边缘检测

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

边缘检测

如果梯度G大于某一阈值,则认为改点(x,y)为边缘点。

然后可用以下公式计算梯度方向:

边缘检测

sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常见的边缘检测方法。

代码:

  1. void Sobel(unsigned char *pSource, unsigned char *pDst)
  2. {
  3.  int    i,j,Gx,Gy,nSum;
  4.  unsigned char *pDs1,*pDs2,*pDs3,*pDs4,*pDst5,*pDst6,*pDst7,*pDst8,*pDst9,*pResut;
  5.  memset(pDst,0,sizeof(unsigned char)*m_nWidth*m_nHeight);
  6.  pDs1 = pSource;
  7.  pDs2 = pDs1+1;
  8.  pDs3 = pDs2+1;
  9.  pDs4 = pSource+m_nWidth;
  10.  pDst5 = pDs4+1;
  11.  pDst6 = pDst5+1;
  12.  pDst7 = pSource+2*m_nWidth;
  13.  pDst8 = pDst7+1;
  14.  pDst9 = pDst8+1;
  15.  pResut = pDst+m_nWidth+1;
  16.  for (i=1;i<m_nHeight-1;i++)
  17.  {
  18.   for (j=1;j<m_nWidth-1;j++)
  19.   {
  20.    Gx = (*pDs3)+2*(*pDst6)+(*pDst9)
  21.     -(*pDst7)-(*pDs1)-2*(*pDs4);
  22.    Gy = (*pDs1)+2*(*pDs2)+(*pDs3)
  23.     -(*pDst7)-2*(*pDst8)-(*pDst9);
  24.    nSum = abs(Gx)+abs(Gy);
  25.    *pResut = nSum>175?255:0;
  26.    pDs1++;
  27.    pDs2++;
  28.    pDs3++;
  29.    pDs4++;
  30.    pDst5++;
  31.    pDst6++;
  32.    pDst7++;
  33.    pDst8++;
  34.    pDst9++;
  35.    pResut++;
  36.   }
  37.   pDs1+=2;
  38.   pDs2+=2;
  39.   pDs3+=2;
  40.   pDs4+=2;
  41.   pDst5+=2;
  42.   pDst6+=2;
  43.   pDst7+=2;
  44.   pDst8+=2;
  45.   pDst9+=2;
  46.   pResut+=2;
  47.  }
  48. }

边缘检测

2.Robert算子——无方向一阶锐化

边缘检测

3.Priwitt算子——无方向一阶锐化

Priwitt算子在一个方向求微分,而在另一个方向求平均,因而对噪声相对不敏感,有抑制噪声的作用,但是像素平均相对于对图像的低通滤,所以Prewitt算子对边缘的定位不如Roberts算子。与Sobel相比,有一定的抗干扰性,图像效果比较干净。

边缘检测

几种方法的效果比较:

  • Sobel算子与Priwitt算法的思路相同,属于同一类型,因此处理效果基本相同;
  • Roberts算子的模板时2*2,提取信息弱;
  • 单方向锐化经过处理之后,也可以对边界进行增强。

4.拉普拉斯算子

二维函数f(x,y)的拉普拉斯是一个二阶的微分,定义为:边缘检测

最终结果为:

边缘检测

边缘检测

Laplacian算子利用二阶导数信息,具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。使得图像经过二阶微分后,在边缘处产生一个陡峭的零交叉点,根据这个对零交叉点判断边缘。

为了改善锐化效果,可以脱离微分的计算原理,在原有的算子基础上,对模板系数进行改变,获得Laplacian变形算子

边缘检测

Laplacian算子对噪声比较敏感,Laplacian算子有一个缺点是它对图像中的某些边缘产生双重响应。所以图像一般先经过平滑处理,通常把Laplacian算子和平滑算子结合起来生成一个新的模板。