最近做实验需要对二维图像进行连通区域分析,在翻阅资料后发现ITk提供了相应的功能。十分好用。在这里总结一下。
实现连通区域分析细分为两个步骤 1、寻找连通区域 2、连通区域分析。
ITK中使用下面的类寻找标记连通区域
#include "itkConnectedComponentImageFilter.h"
该类输出一个对各连通区域标记过的图像,称之为LabelImage.
连通区域分析使用到的类:
#include "itkLabelImageToShapeLabelMapFilter.h"
看名字就大概知道意思这是一个映射:把LabelImage映射到ShapeLabelImage.它的输出类型为
itk::LabelMap< ShapeLabelObjectType >
ITK文档里找到一副图很好解释LabelMap:
A Label object to store the common attributes related to the shape of the object.
提供了很多形状相关的属性描述,例如面积 周长 质心 等效圆半径等等。下面给出一个ITK WiKI提供的例子:
由于ITK没有提供可视化功能,我们可以使用VTK将寻找到的连通区域画出来
ShapeLabelObject提供了一个函数接口GetBoundingBox, 可以获取连通区域的包围盒。该函数的返回类型是
InputImageType::RegionType region
结合VTK中的vtkPolyData类画出一个包围盒
主要代码如下:
CreateBoundingBox(InputImageType::RegionType region)
{
InputImageType::IndexType start=region.GetIndex();
InputImageType::SizeType size=region.GetSize();
vtkSmartPointer<vtkPoints> points=
vtkSmartPointer<vtkPoints>::New();
points->InsertNextPoint(start[0],start[1],0.0);//points of left bottom
points->InsertNextPoint(start[0]+size[0],start[1],0.0);//points of right bottom
points->InsertNextPoint(start[0]+size[0],start[1]+size[1],0.0);//points of right up
points->InsertNextPoint(start[0],start[1]