ITK 求质心

        通过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;
}

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值