📄 天极yesky - 全球中文it第一门户 - 软件 - visual c++ 实现数字化图像的分割2.htm
字号:
<A
href="http://www.yesky.com/SoftChannel/72342371928702976/20030623/1709789_2.shtml">下一页</A></FONT></P></TD>
<TD align=middle width=20></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD vAlign=top
background="天极Yesky - 全球中文IT第一门户 - 软件 - Visual C++ 实现数字化图像的分割2.files/newhard-040906_c_1.gif"
bgColor=#f0f2fb height=1></TD></TR>
<TR>
<TD vAlign=top bgColor=#f0f2fb height=10></TD></TR>
<TR>
<TD vAlign=top bgColor=#f0f2fb>
<TABLE cellSpacing=0 cellPadding=0 width=590 align=center border=0>
<TBODY>
<TR>
<TD><SPAN
class=f14> <B>二、图像边缘检测</B><BR><BR> 数字图像的边缘检测是图像分割、目标区域的识别、区域形状提取等图像分析领域十分重要的基础,是图像识别中提取图像特征的一个重要属性,图像理解和分析的第一步往往就是边缘检测,目前它以成为机器视觉研究领域最活跃的课题之一,在工程应用中占有十分重要的地位。物体的边缘是以图像的局部特征不连续的形式出现的,也就是指图像局部亮度变化最显著的部分,例如灰度值的突变、颜色的突变、纹理结构的突变等,同时物体的边缘也是不同区域的分界处。图像边缘有方向和幅度两个特性,通常沿边缘的走向灰度变化平缓,垂直于边缘走向的像素灰度变换剧烈,根据灰度变化的特点,可分为阶跃型、房顶型和凸缘型,如图一所示,这些变化对应图像中不同的景物。需要读者注意的是,实际分析中图像要复杂的多,图像边缘的灰度变化情况并不仅限于上述标准情况。<BR><BR>
<TABLE cellPadding=0 width="63%" border=0>
<TBODY>
<TR>
<TD width="28%"><IMG
onerror="this.src='http://www.yesky.com/image20010518/48449.gif';"
hspace=3
src="天极Yesky - 全球中文IT第一门户 - 软件 - Visual C++ 实现数字化图像的分割2.files/48449.gif"
align=center vspace=1 border=1><BR>(a)阶跃型<BR></TD>
<TD width="44%"><IMG
onerror="this.src='http://www.yesky.com/image20010518/48450.gif';"
hspace=3
src="天极Yesky - 全球中文IT第一门户 - 软件 - Visual C++ 实现数字化图像的分割2.files/48450.gif"
align=center vspace=1 border=1><BR>(b) 房顶型<BR></TD>
<TD width="28%"><IMG
onerror="this.src='http://www.yesky.com/image20010518/48451.gif';"
hspace=3
src="天极Yesky - 全球中文IT第一门户 - 软件 - Visual C++ 实现数字化图像的分割2.files/48451.gif"
align=center vspace=1 border=1><BR>(c)
凸缘型<BR></TD></TR></TBODY></TABLE><BR> 图一
边缘灰度变换的几种类型<BR><BR> 由于边缘是图像上灰度变化最剧烈的地方,传统的边缘检测就是利用了这个特点,对图像各个像素点进行微分或求二阶微分来确定边缘像素点。一阶微分图像的峰值处对应着图像的边缘点;二阶微分图像的过零点处对应着图像的边缘点。根据数字图像的特点,处理图像过程中常采用差分来代替导数运算,对于图像的简单一阶导数运算,由于具有固定的方向性,只能检测特定方向的边缘,所以不具有普遍性。为了克服一阶导数的缺点,我们定义了图像的梯度为梯度算子为<IMG
onerror="this.src='http://www.yesky.com/image20010518/48454.gif';"
hspace=3
src="天极Yesky - 全球中文IT第一门户 - 软件 - Visual C++ 实现数字化图像的分割2.files/48454.gif"
align=center vspace=1 border=1> ,它是图像处理中最常用的一阶微分算法,式子中<IMG
onerror="this.src='http://www.yesky.com/image20010518/48455.gif';"
hspace=3
src="天极Yesky - 全球中文IT第一门户 - 软件 - Visual C++ 实现数字化图像的分割2.files/48455.gif"
align=center vspace=1 border=1>
表示图像的灰度值,图像梯度的最重要性质是梯度的方向是在图像灰度最大变化率上,它恰好可以放映出图像边缘上的灰度变化。<BR><BR> 图像边缘提取的常用梯度算子有Robert算子、Sobel算子、Prewitt算子、Krisch算子等。下面以边缘检测Sobel算子为例来讲述数字图像处理中边缘检测的实现:<BR><BR> 对于数字图像,可以用一阶差分代替一阶微分;<BR><BR> △xf(x,y)=f(x,y)-f(x-1,y);<BR> △yf(x,y)=f(x,y)-f(x,y-1);<BR><BR> 求梯度时对于平方和运算及开方运算,可以用两个分量的绝对值之和表示,即: <BR><BR> <IMG
onerror="this.src='http://www.yesky.com/image20010518/48456.gif';"
hspace=3
src="天极Yesky - 全球中文IT第一门户 - 软件 - Visual C++ 实现数字化图像的分割2.files/48456.gif"
align=center vspace=1
border=1><BR><BR> Sobel梯度算子是先做成加权平均,再微分,然后求梯度,即:<BR><BR> △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);<BR> △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);<BR> G[f(x,y)]=|△xf(x,y)|+|△yf(x,y)|;<BR><BR> 上述各式中的像素之间的关系见图二<BR>
<TABLE cellSpacing=0 cellPadding=0 width="57%" border=1>
<TBODY>
<TR>
<TD>F(x-1,y-1)</TD>
<TD>F(x,y-1)</TD>
<TD>F(x+1,y-1)</TD></TR>
<TR>
<TD>F(x-1,y)</TD>
<TD>F(x,y)</TD>
<TD>F(x+1,y)</TD></TR>
<TR>
<TD>F(x-1,y+1)</TD>
<TD>F(x,y+1)</TD>
<TD>F(x+1,y+1)</TD></TR></TBODY></TABLE> 图二
Sober算子中各个像素点的关系图<BR><BR> 我在视图类中定义了响应菜单命令的边缘检测Sobel算子实现灰度图像边缘检测的函数(图像数据的获取可以参见我在天极网上发表的的相关文章):<BR><BR>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>void CDibView::OnMENUSobel()<BR>{<BR> CClientDC
pDC(this);<BR>HDC
hDC=pDC.GetSafeHdc();//获取当前设备上下文的句柄;<BR>SetStretchBltMode(hDC,COLORONCOLOR);<BR>HANDLE
data1handle;<BR> LPDIBHDRTMAPINFOHEADER lpDIBHdr;<BR> CDibDoc
*pDoc=GetDocument();<BR> HDIB hdib;<BR> unsigned char
*lpDIBBits;<BR> unsigned char
*data;<BR> hdib=pDoc->m_hDIB;//得到图象数据;<BR> lpDIBHdr=(LPDIBHDRTMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);<BR> lpDIBBits=
lpDIBHdr +* (LPDWORD)lpDIBHdr +
256*sizeof(RGBQUAD);<BR> //得到指向位图像素值的指针;<BR>data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpDIBHdr->biWidth*8)*lpDIBHdr->biHeight); //申请存放处理后的像素值的缓冲区<BR>data=(unsigned
char*)GlobalLock((HGLOBAL)data1handle);<BR> AfxGetApp()->BeginWaitCursor();<BR> int
i,j,buf,buf1,buf2;<BR> for( j=0; jbiHeight;
j++)//以下循环求(x,y)位置的灰度值<BR> for( i=0; ibiWidth;
i++)<BR> {<BR> if(((i-1)>=0)&&((i+1)biWidth)&&((j-1)>=0)&&((j+1)biHeight))<BR> {//对于图像四周边界处的向素点不处理<BR>
buf1=(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))<BR> +2*(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j))<BR>
+(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1));<BR> buf1=buf1-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))<BR> -2*(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j))<BR> -(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1));<BR><BR> //以上是对图像进行水平(x)方向的加权微分<BR><BR> buf2=(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1))<BR> +2*(int)(int)*(lpDIBBits+(i)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1))<BR> +(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j+1)); <BR> buf2=buf2-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))<BR> -2*(int)(int)*(lpDIBBits+(i)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1))<BR> -(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr->biWidth*8)+(j-1));<BR> <BR> //以上是对图像进行垂直(y)方向加权微分<BR><BR> buf=abs(buf1)+abs(buf2);//求梯度<BR><BR> if(buf>255)
buf=255;<BR> if(buf<0)buf=0;<BR> *(data+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j)=(BYTE)buf;<BR> }<BR> else
*(data+i*lpDIBHdr->biWidth+j)=(BYTE)0;<BR> }<BR> for( j=0;
jbiHeight; j++)<BR> for( i=0; ibiWidth;
i++)<BR> *(lpDIBBits+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j)=*(data+i*WIDTHBYTES(lpDIBHdr->biWidth*8)+j);
//处理后的数据写回原缓冲区<BR>StretchDIBits
(hDC,0,0,lpDIBHdr->biWidth,lpDIBHdr->biHeight,0,0,<BR>lpDIBHdr->biWidth,lpDIBHdr->biHeight,<BR>lpDIBBits,(LPDIBHDRTMAPINFO)lpDIBHdr,<BR>DIB_RGB_COLORS,<BR>SRCCOPY); <BR>}<BR></TD></TR></TBODY></TABLE><BR> 上述的数学分析读者可能看起来有些吃力,不过不要紧,对与边缘检测,大家只要知道有若干个检测模板(既边缘检测矩阵)可以直接实现检测功能就行了,现在将常用的检测实现公式列出如下(检测模版可以从相应的算法很容易的得到):<BR><BR> Roberts算子:G[i,i]=|f[i,j]-f[i+1,j+1]|+|f[i+1,j]-f[i,j+1]|;<BR><BR> Sobe算子:G[i,i]=|f[i-1,j+1]+2f[i,j+1]+f[i+1,j+1]-f[i-1,j-1]-2f[i,j-1]-f[i+1,j-1]|<BR> +|f[i-1,j-1]+2f[i-1,j]+f[i-1,j+1]-f[i+1,j-1]-2f[i+1,j]-f[i+1,j+1]|;<BR><BR> 其中G[i,j]表示处理后(i,j)点的灰度值,f[i,j]表示处理前该点的灰度值。<BR><BR></SPAN><BR></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD vAlign=top bgColor=#f0f2fb height=10></TD></TR>
<TR>
<TD vAlign=top
background="天极Yesky - 全球中文IT第一门户 - 软件 - Visual C++ 实现数字化图像的分割2.files/newhard-040906_c_1.gif"
bgColor=#f0f2fb height=1></TD></TR>
<TR>
<TD vAlign=top bgColor=#dee2f5>
<TABLE height=25 cellSpacing=0 cellPadding=0 width=590 align=center
border=0>
<TBODY>
<TR>
<TD width=90></TD>
<TD align=right width=480>
<P align=right><FONT color=red><A
href="http://www.yesky.com/SoftChannel/72342371928702976/20030623/1709789.shtml">上一页</A> <A
href="http://www.yesky.com/SoftChannel/72342371928702976/20030623/1709789.shtml">1</A>
2 <A
href="http://www.yesky.com/SoftChannel/72342371928702976/20030623/1709789_2.shtml">3</A>
<A
href="http://www.yesky.com/SoftChannel/72342371928702976/20030623/1709789_3.shtml">4</A>
<A
href="http://www.yesky.com/SoftChannel/72342371928702976/20030623/1709789_4.shtml">5</A>
<A
href="http://www.yesky.com/SoftChannel/72342371928702976/20030623/1709789_2.shtml">下一页</A></FONT></P></TD>
<TD align=middle width=20></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD vAlign=top
background="天极Yesky - 全球中文IT第一门户 - 软件 - Visual C++ 实现数字化图像的分割2.files/newhard-040906_c_1.gif"
bgColor=#f0f2fb height=1></TD></TR>
<TR>
<TD vAlign=top width=603 bgColor=#f0f2fb>
<TABLE cellSpacing=0 cellPadding=0 width=580 align=center border=0>
<TBODY>
<TR>
<TD height=26><FONT color=#ff0000>·</FONT><A
href="http://www.my5757.com/webwap/zt/itnews/index.jsp"
target=_blank><FONT
color=#ff0000>"WAP天极之IT新闻资讯,50万元等你拿"</FONT></A> <FONT
color=#ff0000>·</FONT><A
href="http://www.my5757.com/webwap/zt/gameinfo/index.jsp"
target=_blank><FONT
color=#ff0000>天极WAP之游戏狂图,50万元等你下载</FONT></A></TD></TR></TBODY></TABLE><BR>
<SCRIPT language=JavaScript type=text/JavaScript> function submitonce(theform){ theform.submit(); theform.art.value=''; theform.name.value=''; theform.pass.value=''; return false; }</SCRIPT>
<TABLE id=comment_table cellSpacing=0 cellPadding=0 width=560 align=center
border=0>
<FORM name=commentfrom onsubmit="return submitonce(this);"
action=http://club.yesky.com/bbs/comment/CommentsNew.jsp method=post
target=_blank><INPUT type=hidden name=forumid> <INPUT type=hidden
name=channel> <INPUT type=hidden name=type> <INPUT type=hidden
name=artid> <INPUT type=hidden name=title> <INPUT type=hidden name=url>
<TBODY>
<TR bgColor=#ede4f8>
<TD colSpan=3 height=1></TD></TR>
<TR>
<TD width=1 bgColor=#ede4f8></TD>
<TD vAlign=top align=middle>
<TABLE height=0 cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR height=0>
<TD width="100%" bgColor=#ffffff>
<TABLE cellSpacing=1 cellPadding=0 width="100%" align=left
bgColor=#ffffff border=0>
<TBODY>
<TR align=middle>
<TD colSpan=6>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD bgColor=#f0f0f0>
<DIV align=center><FONT
color=#585858><B>请 在 此 发 表 评 论</B></FONT></DIV></TD></TR>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width="100%"
border=0>
<TBODY>
<TR>
<TD align=right width="22%">用户名</TD>
<TD width="8%"><INPUT size=7 name=name></TD>
<TD align=right width="21%">密码</TD>
<TD width="6%"><INPUT type=password size=6
name=pass></TD>
<TD align=right width="21%">游客</TD>
<TD width="22%"><INPUT onclick=Disabled();
type=checkbox CHECKED
name=an></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD align=middle colSpan=6><TEXTAREA name=art rows=6 cols=74></TEXTAREA></TD></TR>
<TR>
<TD align=middle colSpan=6>
<DIV align=center><INPUT type=submit value=发表评论 name=Submit>
<INPUT type=reset value=清除内容 name=Submit2> <A
href="http://passport.yesky.com/" target=_blank>注册</A>
<A href="http://bbs.yesky.com/" target=_blank>论坛</A>
<BR></DIV></TD></TR></TBODY></TABLE></TD>
<TD vAlign=top align=middle bgColor=#f2f2f2>
<SCRIPT language=JavaScript> var url1="http://www.yesky.com/comment/"+forumid+"/"+articleid+".js"; document.write('<SCRIPT LANGUAGE="JavaScript" src='+url1+'><\/SCRIPT>'); </SCRIPT>
</TD></TR></TBODY></TABLE></TD>
<TD width=1 bgColor=#ede4f8></TD></TR>
<TR bgColor=#ede4f8>
<TD colSpan=3 height=1></TD></TR></FORM></TBODY></TABLE>
<SCRIPT language=JavaScript type=text/JavaScript> if(commentpower==true){ comment_table.style.display=""; }else{ comment_table.style.display="none"; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -