您的位置:首页 > 其它

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

2016-11-02 14:02 507 查看

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算子和平滑算子结合起来生成一个新的模板。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: