您当前位置:设计在线网 >> 矢量图像技术 >> 浏览文章

VC编程实现数字图像的边缘检测

分享到:
本文章讲述了VC编程实现数字图像的边缘检测.

数字图

像的边缘检测是图像分割、目标区域的识别、区域形状提取等图像分析领域十分重要的基础,图像理解和分析的第一步往往就是边缘检测,目前它以成为机器视觉研究领域最活跃的课题之一,在工程应用中占有十分重要的地位。本文向读者简单介绍一下这个技术,并给出了在Visual C 环境下实现的代码。

所谓边缘就是指图像局部亮度变化最显著的部分,它是检测图像局部变化显著变化的最基本的运算。对于数字图像,图像灰度灰度值的显著变化可以用梯度来表示,以边缘检测Sobel算子为例来讲述数字图像处理中边缘检测的实现:

对于数字图像,可以用一阶差分代替一阶微分;

△xf(x,y)=f(x,y)-f(x-1,y);

△yf(x,y)=f(x,y)-f(x,y-1)

求梯度时对于平方和运算及开方运算,可以用两个分量的绝对值之和表示,即:

G[f(x,y)]={[△xf(x,y)] [△yf(x,y)] } |△xf(x,y)| |△yf(x,y)|;

Sobel梯度算子是先做成加权平均,再微分,然后求梯度,即:

△xf(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);

△yf(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);

G[f(x,y)]=|△xf(x,y)| |△yf(x,y)|;

上述各式中的像素之间的关系见图

我在视图类中定义了响应菜单命令的边缘检测Sobel算子实现灰度图像边缘检测的函数:

void CDibView::OnMENUSobel()

//灰度图像数据的获得参见天极网9.10日发表的拙作//VC数字图像处理一文

{

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(bufbiWidth*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);

}

推荐阅读:
VC数字图像处理编程讲座之四-vc 图像处理类
VC编程实现数字图像的边缘检测
VC++中调用matlab函数(调用engine)
推荐文章  
赞助商链接  
热门排行  
主题推广  
中国设计在线网 All Rights Reserved. 互联网违法和不良信息举报
信息产业部备案号:湘ICP备09001063号