您的位置:首页 > 其它

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

2017-08-11 15:53 671 查看
接上篇(二),继续看自动化阈值分割算法,今天的内容是:迭代阈值法,没找到英文名字,莫非是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;
}

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



参考文献:
http://www.vtk.org/Wiki/ITK/Examples/Segmentation/ThresholdImageFilterDemo
http://blog.csdn.net/a361251388leaning/article/details/50198351
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: