标题:这个是实现将一个图片进行轮廓提取的算法
取消只看楼主
风弄无声
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2008-1-30
 问题点数:0 回复次数:0 
这个是实现将一个图片进行轮廓提取的算法
就是不知道这个算法到底能不能执行,有错了没有,因为本人不会VC++,可是这个算法对我来说很有用,有没有人还会把它转换成C#的呢?
**************************************
函数名称:
   ContourDIB();
参数:
   LPSTR lpDIBBits  -指向原DIB图象指针
   LONG  lWidth    -原图象宽度(像素,必须是4的倍数)
   LONG  lHeidht   -原图象高度(像素数)
返回值:
   BOOL     -运算成功返回true,否则返回flase
说明:
   该函数用于对图象进行轮廓提取运算
    要求目标图象为只有0和255两个灰度图象
*****************************************
BOOL WINAPI ContourDIB(LPSTR lpDIBBits,LONG lWidth,LONG lHeight)
{
   //指向原图象的指针
     LPSTR lpSrc;
   //指向缓存图象的指针
     LPSTR lpDst;
   //指向缓存DIB图象的指针
     LPSTR lpNewDIBBits;
     HLOCAL hNewDIBBits;
   //循环变量
     long i;
     long j;
   unsigned char n,e,s,w,ne,se,nw,sw;
   //像素值
     unsigned char pixel;
   //暂时分配内存,以保存新图象
     hNewDIBBits=LocalAlloc(LHND,lWidth*lHeight);
    if(hNewDIBBits==NULL)
    {
      return FALSE;     
    }
    lpNewDIBBits=(char *)LocalLock(hNewDIBBits);
    //初始化新分配的内存,设定初始值为255
    lpDst=(char *)lpNewDIBBits;
    memset(lpDst,(byte)255,lWidth*lHeight);
    for(j=1;j<lHeight-1;j++)
     {
         for(i=1;i<lWidth-1;i++)
           {
                //指向原图象倒数第J行,第I个像素的指针
                 lpSrc=(char *)lpDIBBits+lWidth*j+i;
                //指向目标图象倒数第J行,第I个像素的指针
                 lpDst=(char *)lpNewDIBBits+lWidth*j+i;
                //取得当前指针处的像素值,注意要转换为unsigned char型
                  pixel=(unsigned char)* lpSrc;
                 if(pixel==0)
                 {
                    *lpDst=(unsigned char)0;
                     nw=(unsigned char)*(lpSrc+lWidth-1);
                     n=(unsigned char)*(lpSrc+lWidth);
                     ne=(unsigned char)*(lpSrc+lWidth+1);
                     w=(unsigned char)*(lpSrc-1);
                     e=(unsigned char)*(lpSrc+1);
                     sw=(unsigned char)*(lpSrc+lWidth-1);
                     s=(unsigned char)*(lpSrc+lWidth);
                     se=(unsigned char)*(lpSrc+lWidth+1);
                   //如果相邻的8个点都是黑点
                   if(nw+n+ne+w+e+sw+s+se==0)
                     *lpDst=(unsigned char)255;
                 }
            }
            //复制运算后的图象
             memcpy(lpDIBBits,lpNewDIBBits,lWidth*lHeight);
            //释放内存
             LocalUnlock(hNewDIBBits);
             LocalFree(hNewDIBBits);
          //返回
              return TRUE;
}

 
搜索更多相关主题的帖子: 轮廓 算法 
2008-12-02 20:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-247452-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.842803 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved