关于matlab函数bwmorph函数的C++版本

下面是我前一段时间改写的matlab的bwmorph函数的代码,这里拿来和大家分享,如果有什么改进可以给我一份!

改写的源码来源于matlab2008。


//2013年7月8号

//zzh编写


//骨架提取主函数
void CProptertyDlg::GetMyNewSkeleton(bool **img, bool **imgSkel,int imgHeight,int imgWidth)
{
   
     //bool img1[576][720]={0};
 int i,j;
 bool **img1,**img2;
 unsigned long int iter=1;
     int done=0;
    
int flag;
int temp=0;
 
 
img1=new bool *[imgHeight];
 for (i=0;i<imgHeight;i++)
 {
 img1[i]=new bool[imgWidth];
 }
 for (i=0;i<imgHeight;i++)
 {
 for (j=0;j<imgWidth;j++)
 {
 img1[i][j]=FALSE;
 }
 }




//bool img2[576][720]={0}; 


 img2=new bool *[imgHeight];
 for (i=0;i<imgHeight;i++)
 {
 img2[i]=new bool[imgWidth];
 }
 for (i=0;i<imgHeight;i++)
 {
 for (j=0;j<imgWidth;j++)
 {
 img2[i][j]=FALSE;
 }
 }
     
 
for(i=0;i<imgHeight;i++)
             for(j=0;j<imgWidth;j++)
   img1[i][j]=img[i][j];

 
     while(!done)
    {
              flag=0;        


  
               skel(img1,img2,imgHeight,imgWidth);
  //判断img2和img1是否相同
  for(i=1;i<imgHeight-1;i++)
                    for(j=1;j<imgWidth-1;j++)
 {
      if( img1[i][j]==img2[i][j]) flag++;
 }
 

for(i=1;i<imgHeight-1;i++)
                     for(j=1;j<imgWidth-1;j++)
img1[i][j]=img2[i][j];


  done = ( (iter>=0xfffffffe)||flag==(imgHeight-2)*(imgWidth-2));
  iter = iter+1;
  


    }

//最后输出结果保存
  for(i=0;i<imgHeight;i++)
                    for(j=0;j<imgWidth;j++)
   imgSkel[i][j]=img2[i][j];


delete(img1);
delete(img2);
 


}




//骨架提取相关函数
bool CProptertyDlg::is3x3LogicalLutOneInOneOut(bool *lut)
{
    bool result = true;
    int lut_length = 512;   /* always 512 for 3x3 lookup table */
    unsigned short bit_mask = 16; /* on-bit corresponding to neighborhood center */
    unsigned short k;
    
    
    for (k = 0; k < lut_length; k++)
    {
        bool neighborhood_has_one_center = (k & bit_mask) != 0;
        if ((neighborhood_has_one_center) && (lut[k] == 0))
        {
            result = false;
            break;
        }
    }


    return result;
}




//骨架提取相关函数
bool CProptertyDlg::is3x3LogicalLutZeroInZeroOut(bool *lut)
{
     bool result = true;
    int lut_length = 512;   /* always 512 for 3x3 lookup table */
    unsigned short bit_mask = 16; /* on-bit corresponding to neighborhood center */
    unsigned short k;
    
    
    for (k = 0; k < lut_length; k++)
    {
        bool neighborhood_has_zero_center = (k & bit_mask) == 0;
        if ((neighborhood_has_zero_center) && (lut[k] != 0))
        {
            result = false;
            break;
        }
    }


    return result;
}




//骨架提取相关函数
void CProptertyDlg::applylutc(bool **imgIN, bool *lut, bool **imgOUT,int imgHeight,int imgWidth)
{
    
    int c,r;
int temp=0;
    if(is3x3LogicalLutZeroInZeroOut(lut))
    {
        
        for ( c= 1; c <imgWidth-1; c++) 
{
            for (r = 1; r < imgHeight-1; r++) 
{
if(imgIN[r][c]!=0)
{
                     temp=imgIN[r-1][c-1]*1+imgIN[r][c-1]*2+imgIN[r+1][c-1]*4+imgIN[r-1][c]*8+imgIN[r][c]*16+imgIN[r+1][c]*32+imgIN[r-1][c+1]*64+imgIN[r][c+1]*128+imgIN[r+1][c+1]*256;
                     imgOUT[r][c]=lut[temp];
}
            }
        }
    }

    else if(is3x3LogicalLutOneInOneOut(lut))
    {
        
        for (c = 1; c < imgWidth-1; c++) 
{
            for (r = 1; r < imgHeight-1; r++) 
{
                if (imgIN[r][c]==0)
                {
                    temp=imgIN[r-1][c-1]*1+imgIN[r][c-1]*2+imgIN[r+1][c-1]*4+imgIN[r-1][c]*8+imgIN[r][c]*16+imgIN[r+1][c]*32+imgIN[r-1][c+1]*64+imgIN[r][c+1]*128+imgIN[r+1][c+1]*256;
                     imgOUT[r][c]=lut[temp];
                }
                else
                {
                    imgOUT[r][c]=TRUE;
                }
                
            }
        }
    }
    else
    {
        for (c = 1; c < imgWidth-1; c++) 
{
            for (r = 1; r < imgHeight-1; r++) 
{
               temp=imgIN[r-1][c-1]*1+imgIN[r][c-1]*2+imgIN[r+1][c-1]*4+imgIN[r-1][c]*8+imgIN[r][c]*16+imgIN[r+1][c]*32+imgIN[r-1][c+1]*64+imgIN[r][c+1]*128+imgIN[r+1][c+1]*256;
               imgOUT[r][c]=lut[temp]; 
            }
        }
    }
}




//骨架提取子函数
void CProptertyDlg::skel(bool **imgIN, bool **imgOUT,int imgHeight,int imgWidth )
{
//8个查找表
bool skel1[512] = {
     0  ,   0  ,   0  ,   0  ,   0   ,  0   ,  0   ,  0    , 0    , 0   ,  0   ,  0 ,
     0   ,  0  ,   0 ,    0  ,   0  ,   0    , 0   ,  0  ,   0 ,    0  ,   0  ,   0 ,
     0   ,  0 ,    0   ,  0    , 0  ,   0    , 0  ,   0  ,   0   ,  0  ,   0 ,    0 ,
     0  ,   0  ,   0   ,  0  ,   0   ,  0     ,0    , 0   ,  0  ,   0   ,  0  ,   0 ,
     0   ,  0  ,   0  ,   0  ,   0  ,   0   ,  0  ,   0  ,   0   ,  0   ,  0   ,  0 ,
     0    , 0 ,    0   ,  0   ,  0   ,  0   ,  0   ,  0   ,  0  ,   0  ,   0    , 0 ,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值