可能是因为几乎每个图像算法库中都会有孔洞填充算法吧,一直觉得是一个很简单的事儿,从来都没注意过它的存在,今天花点时间理一下吧。
itk提供了两个的补洞类:
itkGrayscaleFillholeImageFilter(针对灰度图像), itkBinaryFillholeImageFilter(针对二值图像)
具体用法不要太简单:
typedef itk::GrayscaleFillholeImageFilter<ImageType,ImageType> FillHoleType;
//typedef itk::BinaryFillholeImageFilter<ImageType,ImageType> FillHoleType;
FillHoleType::Pointer fillHoleFilter = FillHoleType::New();
fillHoleFilter->SetInput(input_data);
fillHoleFilter->Update();
0. 什么是孔洞?
一般是在二值图像中,一种特征被另一种特征完全包围。
1.怎么找孔洞?
遍历图像,将符合特征的点都找出来,做标记或者直接修正;
2.怎么遍历?
XYZ逐渐扫描。
3.怎么找特征?
一般都是Flood fill,网上一搜一大片。
4.怎么标记?
容器啊。
5.怎么修正?
修改特征值,比如修改灰度值。
以上012345中,除了3,别的方法基本都是确定的。所以孔洞填充算法的差异就在于3的计算能力。网上基本都是针对二维图像的,可这里的医学图像都是三维的,运算速度明显下降一倍啊,先将就吧。
Flood fill A: 6邻域/26邻域
Flood fill B: XYZ三个方向依次扫描
这里的孔洞填充必须遍历整个图像,是因为预先无法定位孔洞的位置,如果预先提供一个seed告知位置,那么孔洞填充算法瞬间变成了图像分割算法中的区域生长;
如果将每次扫描新到的孔洞放在不同的容器里,容器的数据就是孔洞的数量,那么孔洞填充算法瞬间变成了图像特征识别中的自动数羊;
如果把每个容器的点数都统计出来,通过spacing做变换,那么孔洞填充算法瞬间变成了自动体积(面积)测量;
如果计算每个容器的重心出来,那么孔洞填充算法瞬间变成了自动定位系统;
如果把容器中的特征都保存下来做参数分析,对下一次的算法做校正,那么孔洞填充算法很快就变成了人工智能。。。我怀疑,还有什么是它不能变的?
都说孔洞填充算法是万能的,谁说不是呢?
都说长大后要仗剑走天涯,可后来,剑呢?
https://en.wikipedia.org/wiki/Flood_fill
http://lodev.org/cgtutor/floodfill.html#8-Way_Method_With_Stack
http://www.cnblogs.com/Imageshop/p/3308183.html
http://dsqiu.iteye.com/blog/1689130