提取骨架(细化)

BOOL IsContourP(int x,int y, IplImage *Src_Img)
{
 BOOL p[10] ={0};
 int LineBytes =Src_Img->widthStep;
 BYTE *lpPtr= (BYTE*)(Src_Img->imageData+LineBytes*y)+x;

 p[2]=*(lpPtr-LineBytes) ? true:false;
 p[3]=*(lpPtr-LineBytes+1) ? true:false;
 p[4]=*(lpPtr+1) ? true:false;
 p[5]=*(lpPtr+LineBytes+1) ? true:false;
 p[6]=*(lpPtr+LineBytes) ? true:false;
 p[7]=*(lpPtr+LineBytes-1) ? true:false;
 p[8]=*(lpPtr-1) ? true:false;
 p[9]=*(lpPtr-LineBytes-1) ? true:false;

 int Np=0;//邻域不为零节点总数
 int Tp=0;//邻域节点由0变成1的次数
 for (int i=2; i<10; i++)
 {
  Np += p[i];
  int k= (i<9) ? (i+1) : 2;
  if ( p[k] -p[i]>0)
  {
   Tp++;
  }
 }
 int p246= p[2] && p[4] && p[6];
 int p468= p[4] && p[6] && p[8];

 int p24= p[2] && !p[3] && p[4] && !p[5] && !p[6] && !p[7] && !p[8] && !p[9];
 int p46= !p[2] && !p[3] && p[4] && !p[5] && p[6] && !p[7] && !p[8] && !p[9];
 int p68= !p[2] && !p[3] && !p[4] && !p[5] && p[6] && !p[7] && p[8] && !p[9];
 int p82= p[2] && !p[3] && !p[4] && !p[5] && !p[6] && !p[7] && p[8] && !p[9];

 int p782= p[2] && !p[3] && !p[4] && !p[5] && !p[6] && p[7] && p[8] && !p[9];
 int p924= p[2] && !p[3] && p[4] && !p[5] && !p[6] && !p[7] && !p[8] && p[9];
 int p346= !p[2] && p[3] && p[4] && !p[5] && p[6] && !p[7] && !p[8] && !p[9];
 int p568= !p[2] && !p[3] && !p[4] && p[5] && p[6] && !p[7] && p[8] && !p[9];

 int p689= !p[2] && !p[3] && !p[4] && !p[5] && p[6] && !p[7] && p[8] && p[9];
 int p823= p[2] && p[3] && !p[4] && !p[5] && !p[6] && !p[7] && p[8] && !p[9];
 int p245= p[2] && !p[3] && p[4] && p[5] && !p[6] && !p[7] && !p[8] && !p[9];
 int p467= !p[2] && !p[3] && p[4] && !p[5] && p[6] && p[7] && !p[8] && !p[9];

 int p2468= p24 || p46 || p68 || p82;
 int p3333= p782 || p924 || p346 || p568 || p689 || p823 || p245 || p467;

 //判定条件第一个由数字图像处理上得到,由于结果不够满意,又加上两个条件
 return ( !p246 && !p468 && (Np<7) && (Np>1) && (Tp==1) ) || p2468 || p3333;
}


void thin( IplImage *Src_Img)//细化轮廓,得到单像素轮廓
{
 int i, j;
 CvSize img_size = cvGetSize(Src_Img);
 int Remove_Num=0;

 do //循环调用,直至没有可以去掉的点
 {
  Remove_Num=0;
  for (j = 1; j < img_size.height-1; j++)
  {
   for(i = 1; i < img_size.width-1; i++)
   {
    BYTE gray_value = ((BYTE*)(Src_Img->imageData + Src_Img->widthStep*j))[i];
    if ( gray_value && IsContourP( i, j, Src_Img))//符合条件,去掉
    {
     ((BYTE*)(Src_Img->imageData + Src_Img->widthStep*j))[i]=(UCHAR)0;
     Remove_Num++;
    }  //if
   }  //for
  }  //for
 } while( Remove_Num);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值