图像处理算法基础(九)---求最佳分割门限并分割

关于阈值分割前面已经写过一篇但是最重要的部分阈值的求取没有说明,本文主要讲怎么求取最佳分割门限,此处讲的是全局门限,复杂的图像只需把图像分成若干小块然后对每一块求取最佳分割门限然后分割即可。

步骤讲解:

代码实现如下:

int  picProcessBasics::IMGthresholdSeg(IplImage* pImg,int T0)
 {
  if(NULL == pImg)
   return -1;

  if(pImg->nChannels != 1)
  {
 cout<<"param error"<<endl;
 return -1;
  }

  uchar* old_data = (uchar*)pImg->imageData; 
 
   int numG1 = 0;//记录大于T值得像素个数
   int numG2 = 0;
   long int sumG1 = 0;//记录大于T值的像素灰度级之和
    long int sumG2 = 0;
 int valueG1 = 0;//记录大于T值得像素平均灰度值
   int valueG2 = 0;
   long int sum = 0; 
   int resT=0;

 //1.求图像灰度级平均值
 for(int i = 0;i < pImg->height;i++){ 
  for(int j = 0; j < pImg->width; j++){ 
 
   sum += old_data[pImg->widthStep * i + j ];   
        } 
    }

 int tempT=sum/(pImg->height*pImg->width);//将整幅图像灰度级的平均值作为门限T的初始值
 resT=tempT;
 do
 {
  tempT=resT;
  for(int i = 0;i < pImg->height;i++){ 
   for(int j = 0; j < pImg->width; j++){ 
 
    if(old_data[pImg->widthStep * i + j ] > tempT) 
    {
     sumG1 += old_data[pImg->widthStep * i + j ];
     numG1++;
    }
    else
    {
     sumG2 += old_data[pImg->widthStep * i + j ];
     numG2++;
    }
   } 
  }
  valueG1=sumG1/numG1;
  valueG2=sumG2/numG2;
  resT=(valueG1+valueG2)/2;

 }while(abs(resT-tempT) > T0);

 for(int i = 0;i < pImg->height;i++){ 
  for(int j = 0; j < pImg->width; j++){ 
 
   if(old_data[pImg->widthStep * i + j ] > resT) 
   {
    old_data[pImg->widthStep * i + j ]=255;
   }
   else
   {
    old_data[pImg->widthStep * i + j ]=0;
   }
  } 
 }

 return 0;
 }

原图像:

分割后图像:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值