itk中的图像分割算法(三)

接上篇(二),继续看自动化阈值分割算法,今天的内容是:迭代阈值法,没找到英文名字,莫非是Iterative threshold segmentation?


我用的itk中没有提供这个类,那就自己实现一下吧~ 照旧,本文中只搞代码实现,理论请自行搜索~

本文参考了参考文献中的部分代码,详情请点击最后的链接。

int IterationThreshold(ImageType2D *src)  
{  
	ImageType2D::RegionType inputRegion = src->GetLargestPossibleRegion();
	ImageType2D::SizeType size = inputRegion.GetSize();//获得图像大小

    int width = size[0];//宽
    int height = size[1];//高
  
	//histogram 获得灰度直方图
	float histogram[256] = {0}; 
	typedef itk::ImageRegionIteratorWithIndex<ImageType2D>   FieldIterator;
	FieldIterator fieldIter( src, src->GetLargestPossibleRegion());//创建一个像素迭代器
	fieldIter.GoToBegin();//迭代器指向图像数组开始
	ImageType2D::IndexType index;
	while( !fieldIter.IsAtEnd()  )//不到最后一个点,一直循环下去
	{
		index=fieldIter.GetIndex();//获得该点坐标
		unsigned char p = src->GetPixel(index);//获得该点像素值
		histogram[p]++;//放入灰度直方图
		++fieldIter;
	} 
  
    //求图像的平均灰度值作为初始阈值  
    int T0 = 0;  
    for (int i = 0; i < 256; i ++)  
    {  
        T0 += i * histogram[i];  
    }  
    T0 /= width * height; //平均灰度
  
    //迭代  
    int T1 = 0, T2 = 0;  
    int num1 = 0, num2 = 0;  
    int T = 0;  
    while (1)  
    {  
        for ( int i = 0; i < T0+1; i ++) //小于T0的部分
        {  
            T1 += i * histogram[i];  
            num1 += histogram[i];  
        }  
  
        if (num1 == 0)  
            continue;  
  
        for ( int i = T0 + 1; i < 256; i ++) //大于T0的部分 
        {  
            T2 += i * histogram[i];  
            num2 += histogram[i];  
        }  
  
        if (num2 == 0)  
            continue;  
  
        T = (T1 / num1  + T2 / num2) / 2; //刷新阈值T
  
        if ( T == T0 )  
            break;  //若相等,返回T
        else  
            T0 = T; //若不等,继续
    }  
  
    return T;  
}  

所谓迭代法,就是先猜一个值,看这个值是不是符合要求,如果不是,就迭代再猜,直到有一个值能贴近要求的最优解。


参考文献:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值