⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 天极yesky - 全球中文it第一门户 - 软件 - visual c++ 实现数字化图像的分割2.htm

📁 Visual C++ 实现数字化图像的分割_好文章和代码
💻 HTM
📖 第 1 页 / 共 4 页
字号:
            &nbsp;<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-&gt;m_hDIB;//得到图象数据;<BR> lpDIBHdr=(LPDIBHDRTMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);<BR> lpDIBBits= 
                  lpDIBHdr +* (LPDWORD)lpDIBHdr + 
                  256*sizeof(RGBQUAD);<BR> //得到指向位图像素值的指针;<BR>data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)*lpDIBHdr-&gt;biHeight); //申请存放处理后的像素值的缓冲区<BR>data=(unsigned 
                  char*)GlobalLock((HGLOBAL)data1handle);<BR> AfxGetApp()-&gt;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)&gt;=0)&amp;&amp;((i+1)biWidth)&amp;&amp;((j-1)&gt;=0)&amp;&amp;((j+1)biHeight))<BR>   {//对于图像四周边界处的向素点不处理<BR>    
                  buf1=(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+(j-1))<BR>     +2*(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+(j))<BR>      
                  +(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+(j+1));<BR>    buf1=buf1-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+(j-1))<BR>     -2*(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+(j))<BR>     -(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+(j+1));<BR><BR>    //以上是对图像进行水平(x)方向的加权微分<BR><BR>    buf2=(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+(j+1))<BR>     +2*(int)(int)*(lpDIBBits+(i)*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+(j+1))<BR>     +(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+(j+1)); <BR>    buf2=buf2-(int)(int)*(lpDIBBits+(i-1)*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+(j-1))<BR>     -2*(int)(int)*(lpDIBBits+(i)*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+(j-1))<BR>     -(int)(int)*(lpDIBBits+(i+1)*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+(j-1));<BR> <BR>    //以上是对图像进行垂直(y)方向加权微分<BR><BR>    buf=abs(buf1)+abs(buf2);//求梯度<BR><BR>   if(buf&gt;255) 
                  buf=255;<BR>     if(buf&lt;0)buf=0;<BR>   *(data+i*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+j)=(BYTE)buf;<BR>   }<BR>   else 
                  *(data+i*lpDIBHdr-&gt;biWidth+j)=(BYTE)0;<BR>  }<BR> for( j=0; 
                  jbiHeight; j++)<BR> for( i=0; ibiWidth; 
                  i++)<BR> *(lpDIBBits+i*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+j)=*(data+i*WIDTHBYTES(lpDIBHdr-&gt;biWidth*8)+j); 
                        //处理后的数据写回原缓冲区<BR>StretchDIBits 
                  (hDC,0,0,lpDIBHdr-&gt;biWidth,lpDIBHdr-&gt;biHeight,0,0,<BR>lpDIBHdr-&gt;biWidth,lpDIBHdr-&gt;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>&nbsp;&nbsp;<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> 
            &nbsp;<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>&nbsp;&nbsp;&nbsp;&nbsp;<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> 
                        &nbsp; <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 + -