基于Sobel算子的图像边缘检测及其实现

时间:2022-10-04 10:19:15

基于Sobel算子的图像边缘检测及其实现

摘要:Sobel算子是图像边缘检测中常用的方法之一,利用像素的左、右、上、下邻域的灰度加权算法,根据在边缘点处达到极值这一原理进行边缘检测。该方法不但产生较好的检测效果,而且对噪声具有平滑作用,可以提供较为精确的边缘方向信息。本文提供了利用Sobel算子实现灰度图像边缘检测的C++源程序。

关键词:边缘检测;Sobel算子;梯度;噪声

中图分类号:TP183文献标识码:A文章编号:1009-3044(2008)15-20ppp-0c

Image Fringe Detection and Realization Based on Sobel Operator

SUN Hong-lin,LIAO Ji-wang

(Hunan Information College, Changsha 410200,China)

Abstract: Sobel operator is one of common Image fringe detection techniques, using image element's left and right, top and bottom neighborhood field's ash degree weighting algorithm, basing on the principle of reaching extremum at the fringe dot, we carry through fringe detection. The technique not only produces preferable detection effect, but also has the flatness effect on yawp and can offer exact fringe direction imformation. This paper offers C++ source program which realizes ash degree image fringe detection using Sobel operator

Key words: fringe detection; Sobel operator; grads; yawp

1 引言

边缘是图像最基本的特征。所谓边缘是指图像周围像素灰度有阶跃变化或屋顶状变化的像素的集合,它存在于目标与背景、目标与目标、区域与区域、基元与基元之间。边缘具有方向和幅度两个特征,沿边缘走向,像素值变化比较平缓;垂直于边缘走向,像素值变化比较剧烈,可能呈现阶跃状,也可能呈现斜坡状因此,边缘可以分为两种:一种为阶跃性边缘,它两边的像素灰度值有着明显的不同;另一种为屋顶状边缘,它位于灰度值从增加到减少的变化转折点。对于阶跃性边缘,二阶方向导数在边缘处呈零交叉;而对于屋顶状边缘,二阶方向导数在边缘处取极值。

边缘检测技术是图像处理和计算机视觉等领域最基本的技术,如何快速、精确的提取图像边缘信息一直是国内外研究的热点,然而边缘检测又是图像处理中的一个难题。经典的边缘检测方法是对原始图像中像素的某小邻域来构造边缘检测算子。常用的边缘检测方法有Roberts算子、Sobel算子、Prewitt算子、Kirsch算子、LOG算子等。

2 Sobel算子特点分析

Sobel算子在求梯度之前,首先进行邻域平均或加权平均,然后进行微分,就能抑制噪声。Sobel 边缘检测算子使用两个如下有向算子(一个水平的,一个是垂直的),每一个逼近一个偏导数:

xf(x,y)

={f(x+1,y-1)+2f(x+1,y)+f(x+1,y+1)}-{f(x-1,y-1)+2f(x-1,y)+f(x-1,y+1)}

yf(x,y)

={f(x-1,y+1)+2f(x,y+1)+f(x+1,y+1)}-{f(x-1,y-1)+2f(x,y-1)+f(x+1,y-1)}

如果用Sobel算子检测图像M的边缘的话,可以先分别用水平算子和垂直算子对图像进行卷积,得到的是两个矩阵,在不考虑边界的情形下也是和原图像同样大小的图像M1,M2,他们分别表示图像M中相同位置处的两个偏导数。然后把M1,M2对应位置的两个数平方后相加得到一个新的矩阵G,G表示M中各个像素的灰度的梯度值(一个逼近)。这样就可以通过阈值处理得到边缘图像。

Sobel 算子利用像素的左、右、上、下邻域的灰度加权算法,根据在边缘点处达到极值这一原理进行边缘检测。该方法不但产生较好的检测效果,而且对噪声具有平滑作用,可以提供较为精确的边缘方向信息。

3 Sobel算子实现灰度图像边缘检测的函数源程序

void CDibView::OnMENUSobel()

{ HANDLE data1handle;

LPBITMAPINFOHEADER lpBi;

CDibDoc *pDoc=GetDocument();

HDIB hdib;

unsigned char *hData;

unsigned char *data;

hdib=pDoc->m_hDIB;

BeginWaitCursor();

lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);

hData= lpbi +* (LPDWORD)lpbi + 256*sizeof(RGBQUAD);

//得到指向位图像素值的指针

pDoc->SetModifiedFlag(TRUE);//设修改标志为"TRUE"

data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight);

//申请存放处理后的像素值的缓冲区

data=(unsigned char*)GlobalLock((HGLOBAL)data1handle);

AfxGetApp()->BeginWaitCursor();

int i,j,buf,buf1,buf2;

for( j=0; jbiHeight; j++)//以下循环求(x,y)位置的灰度值

for( i=0; ibiWidth; i++)

{

if(((i-1)>=0)&&((i+1)biWidth)&&((j-1)>=0)&&((j+1)biHeight))

{//对于图像四周边界处的向素点不处理

buf1=(int)*(hData+(i+1)*WIDTHBYTES(lpBi->biWidth*8)+(j-1))

+2*(int)*(hData+(i+1)*WIDTHBYTES(lpBi->biWidth*8)+(j))

+(int)(int)*(hData+(i+1)*WIDTHBYTES(lpBi->biWidth*8)+(j+1));

buf1=buf1-(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi->biWidth*8)+(j-1))

-2*(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi->biWidth*8)+(j))

-(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi->biWidth*8)+(j+1));

//x方向加权微分

buf2=(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi->biWidth*8)+(j+1))

+2*(int)(int)*(hData+(i)*WIDTHBYTES(lpBi->biWidth*8)+(j+1))

+(int)(int)*(hData+(i+1)*WIDTHBYTES(lpBi->biWidth*8)+(j+1));

buf2=buf2-(int)(int)*(hData+(i-1)*WIDTHBYTES(lpBi->biWidth*8)+(j-1))

-2*(int)(int)*(hData+(i)*WIDTHBYTES(lpBi->biWidth*8)+(j-1))

-(int)(int)*(hData+(i+1)*WIDTHBYTES(lpBi->biWidth*8)+(j-1));

//y方向加权微分

buf=abs(buf1)+abs(buf2);//求梯度

if(buf>255) buf=255;

if(buf

*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j)=(BYTE)buf;

}

else *(data+i*lpBi->biWidth+j)=(BYTE)0;

}

for( j=0; jbiHeight; j++)

for( i=0; ibiWidth; i++)

*(hData+i*WIDTHBYTES(lpBi->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpBi->biWidth*8)+j);

//处理后的数据写回原缓冲区

AfxGetApp()->EndWaitCursor();

GlobalUnlock((HGLOBAL)hdib);

GlobalUnlock(data1handle);

GlobalFree(date1handle);

EndWaitCursor();

Invalidate(TRUE);

}

4 实验结果及讨论

该图像处理程序在Windows2000环境下编译通过,图1给出了对常用的Lena图像依据图像处理算法得到的图像二值化、高通滤波、Sobel边缘算子的处理结果,(c)图是在进行Sobel算子处理后,又对它进行了二值化处理得到的。

从(b)可以看出,Soble 算子对噪声有抑制作用,因此不会出现很多孤立的边缘像素点;但Sobel算子对边缘的定位不是很准确,图像的边界宽度往往不止一个像素。

参考文献:

[1] 章毓晋.图象工程[M].北京:清华大学出版社,1999.

[2] Health A., Sarkar S., Sanocki T., et parison of Edge Detectors: A Methodology and InitialStudy[J]. Computer Vision and Image Understanding,1998,69(1):38-54.

[3] 刑军.基于Sobel算子数字图像的边缘检测[J].微机发展,2005,15(9):48-52.

[4] 刘彩.一种改进的Sobel图像边缘检测算法[J].贵州工业大学学报(自然科学版),2004,33(5):77-79.

收稿日期:2008-03-18

基金项目:湖南省教育厅资助科研项目(06D69)

作者简介:孙洪淋(1971-),女,硕士,湖南信息职业技术学院讲师,研究方向:智能控制、机器人视觉伺服控制。

上一篇:计算机防火墙的体系配置与选择实施技术 下一篇:浅析医院信息系统