边界是图像的基本特征之一,同时也是图像的研究热点。本文的内容是对二值图像的边界识别。
1.基于边界搜索的方法:
光栅扫描法:设定一定的阈值进行多次行扫描和列扫描;
边缘跟踪法:先检测到一个边缘点,然后沿着边缘点跟踪计算,直到回到边缘点;其中,八邻域搜索的边界跟踪算法,又叫标签处理算法;
虫随法:进入黑色区域,左转,进入黑色区域,右转,一直回到运动起始点。
2.基于数学形态学的方法:
先腐蚀再相减。
针对边界提取,itk中也有几个不同的类,分别都依托与不同的理论基础。
itkBinaryErodeImageFilter 和 itkSimpleContourExtractorImageFilter 中用的原理是先腐蚀再相减;
itkContourExtractor2DImageFilter 中的原理是"marching squares",类似三维重建面绘制中的"marching cube";
itkCannyEdgeDetectionImageFilter 是依附于canny算子的边缘搜索;
itkBinaryContourImageFilter 和 itkLabelContourImageFilter 貌似比较特殊,在像素扫描的同时加入了多线程,在速度方面有一定的优势。
下面看itkBinaryContourImageFilter的用法:
typedef itk::BinaryContourImageFilter< ImageType, ImageType> FilterType;
FilterType::Pointer binaryContourFilter= FilterType::New();
binaryContourFilter->SetInput( intput_data);
binaryContourFilter->FullyConnectedOn();//开启26邻域单连通
binaryContourFilter->SetForegroundValue(0);//设置前景色
binaryContourFilter->SetBackgroundValue(255);//设置背景色
binaryContourFilter->Update();
(其他几个类的用法都很简单,都是SetInput->Update->GetOutput,就不一一列举了。可能由于兼容高维度的原因,itk的这几个类有写得好烦,各种迭代套循环~~有时间自己写一个试试)
-------这里先留坑------
参考文献:
1. https://itk.org/Wiki/ITK/Examples/EdgesAndGradients/BinaryContourImageFilter
2. https://itk.org/Wiki/ITK/Examples/EdgesAndGradients/BinaryBoundaries
3. http://blog.youkuaiyun.com/wqvbjhc/article/details/2299066
4. 《二值图像中目标物体轮廓的边界跟踪算法》