通过LabelGeometryImageFilter可以求Label Image各个区域的质心和BoundingBox。然而,如果图像的spacing不是1,它并不会考虑进去,因此得到的结果并未我们所愿的。针对这个问题,有人实现了相关的模块(itkOBBLabelMap),可以解决这个问题,将其添加到源码,然后重新配置和编译即可。(原文链接https://blog.csdn.net/Q1302182594/article/details/50447802)
QList <QPoint3D> calculateRegionCentroid(vtkImageData *data)
{
QList < QPoint3D > centroids; // QPoint3D是仿照QPoint(不支持浮点数)而定义的一个类,支持浮点数
if ( !data )
return centroids;
double spacing[3];
data->GetSpacing( spacing );
itk::VTKImageToImageFilter<UCharImageType>::Pointer vtk2itkConnector // 将VTK图像转换为ITK图像
= itk::VTKImageToImageFilter< UCharImageType>::New();
BinaryImageToLabelMapFilterType::Pointer binaryImageToLabelMapFilter
= BinaryImageToLabelMapFilterType::New();
LabelMapToLabelImageFilterType::Pointer labelMapToLabelImageFilter
= LabelMapToLabelImageFilterType::New();
LabelGeometryImageFilterType::Pointer labelGeometryImageFilter
= LabelGeometryImageFilterType::New();
vtk2itkConnector->SetInput( data );
binaryImageToLabelMapFilter->SetInput( vtk2itkConnector->GetOutput() );
labelMapToLabelImageFilter->SetInput( binaryImageToLabelMapFilter->GetOutput());
labelGeometryImageFilter->SetInput( labelMapToLabelImageFilter->GetOutput() );
// These generate optional outputs.
labelGeometryImageFilter->CalculatePixelIndicesOn();
labelGeometryImageFilter->CalculateOrientedBoundingBoxOn();
labelGeometryImageFilter->CalculateOrientedLabelRegionsOn();
labelGeometryImageFilter->Update();
LabelGeometryImageFilterType::LabelsType allLabels = labelGeometryImageFilter->GetLabels();
LabelGeometryImageFilterType::LabelsType::iterator allLabelsIt;
for( allLabelsIt = allLabels.begin(); allLabelsIt != allLabels.end(); allLabelsIt++ ) {
LabelGeometryImageFilterType::LabelPixelType labelValue = *allLabelsIt;
if ( (int)labelValue > 0 ) {
double x = labelGeometryImageFilter->GetCentroid( labelValue )[0];
double y = labelGeometryImageFilter->GetCentroid( labelValue )[1];
centroids.append( QPoint3D( x * spacing[0], y * spacing[1], 0 ) );
}
}
binaryImageToLabelMapFilter->SetInput( NULL );
labelMapToLabelImageFilter->SetInput( NULL );
labelGeometryImageFilter->SetInput( NULL );
vtk2itkConnector->SetInput( NULL );
return centroids;
}