区域生长学习

不知道为什么这个代码怎么结果显示有问题呐?谁来帮忙改改啊?委屈

#include "highgui.h"
#include "cv.h"
#include <cvaux.h>
/************************************************************************
 * /说明
 *   对应象素为生长区域,表示为非生长区域

 *   区域生长一般包含三个比较重要的问题:

 *       1. 种子点的选取

 *       2. 生长准则

 *       3. 终止条件

 *   可以认为,这三个问题需要具体分析,而且每个问题解决的好坏直接关系到

 *   区域生长的结果。

 *   本函数的种子点选取为图像的中心,生长准则是相邻象素的象素值小于

 *   nThreshold, ()终止条件是一直进行到再没有满足生长准则需要的象素时为
 *************************************************************************

 */

// 在这个代码中,它认为这张图片就是一个区域,选取了中间点为种子点。

void RegionGrow(IplImage *img, int nThreshold)

{
     static int nDx[]={-1,0,1,0};
     static int nDy[]={0,1,0,-1};
     nThreshold = 20;

     // 图象的长宽大小
     int nWidth             = img->width;
     int nHeight            = img->height        ;

     // 图像在计算机在存储中的实际大小
     //CSize sizeImageSave    = ((nWidth+3)/4 )*4 ;

     // 图像在内存中每一行象素占用的实际空间
     int nSaveWidth = img->widthStep ;

     // 初始化
	 unsigned char * pUnRegion = (unsigned char * )img->imageData;
     memset(pUnRegion,0,sizeof(unsigned char)*nWidth*nHeight);

     //设置种子点为图像的中心
     int nSeedX = nWidth /2 ,
		 nSeedY = nHeight/2 ;

     // 定义堆栈,存储坐标并分配空间
     int * pnGrowQueX = new int [nWidth*nHeight];
     int * pnGrowQueY = new int [nWidth*nHeight];

     // 图像数据的指针
     unsigned char *  pUnchInput =(unsigned char * )img->imageData;

     // 定义堆栈的起点和终点
     // 当nStart=nEnd, 表示堆栈中只有一个点
     int nStart = 0;
     int nEnd = 0 ;

     // 把种子点的坐标压入栈
     pnGrowQueX[nEnd] = nSeedX;
     pnGrowQueY[nEnd] = nSeedY;

     // 设置当前正在处理的象素
     int nCurrX = 0;
     int nCurrY = 0;

     // 循环控制变量
     int k = 0;

     // 图象的横纵坐标,用来对当前象素的邻域进行遍历
     int xx = 0;
     int yy = 0;

     while (nStart <= nEnd)
     {
         // 当前种子点的坐标
         nCurrX = pnGrowQueX[nStart];
         nCurrY = pnGrowQueY[nStart];
         // 对当前点的邻域进行遍历
         for (k = 0; k < 4; ++k)    
         {    
              // 4邻域象素的坐标
              xx = nCurrX + nDx[k];
              yy = nCurrY + nDy[k];

              // 判断象素(xx,yy) 是否在图像内部
              // 判断象素(xx,yy) 是否已经处理过
              // pUnRegion[yy*nWidth+xx]==0 表示还没有处理

              // 生长条件:判断象素(xx,yy)和当前象素(nCurrX,nCurrY) 象素值差的绝对值

              if ( (xx < nWidth) && (xx>=0) && (yy<nHeight) && (yy>=0) 

                       && (pUnRegion[yy*nWidth+xx]==0) 

                       && abs(pUnchInput[yy*nSaveWidth+xx] - pUnchInput[nCurrY*nSaveWidth+nCurrX])<nThreshold )
              {
                   // 堆栈的尾部指针后移一位
                   nEnd++;
                   // 象素(xx,yy) 压入栈
                   pnGrowQueX[nEnd] = xx;
                   pnGrowQueY[nEnd] = yy;

                   // 把象素(xx,yy)设置成逻辑()
                   // 同时也表明该象素处理过
                   pUnRegion[yy*nWidth+xx] = 255 ;

              }
         }
         nStart++;

     }
     // 释放内存

     delete []pnGrowQueX;

     delete []pnGrowQueY;

     pnGrowQueX = NULL ;

     pnGrowQueY = NULL ;
	 img->imageData = (char *)pUnRegion;

}

int main()
{
	IplImage *img = cvLoadImage("E:\\111.jpg");
    RegionGrow(img,10);
	cvShowImage("区域生长",img);//载入转化后的图像
	cvWaitKey(0);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值