计算对称表面距离[Python]

时间:2017-11-14 10:08:35

标签: python image-segmentation itk simpleitk

我想计算2个二元对象之间的表面距离度量,也就是肝脏肿瘤的分割。我想要计算:

  • 平均对称表面距离
  • 均方根对称距离
  • Hausdorff距离(也称为最大对称距离)

我找到了两个可以帮助我计算这些指标的库,但是我得到了相互矛盾的结果,所以我很困惑它们是如何工作的。

这是我的简单ITK和MedPy的代码。

from medpy import metric
import pandas as pd
import SimpleITK as sitk
import numpy as np
reference_segmentation = sitk.ReadImage('tumorSegm', sitk.sitkUInt8)
segmentation = sitk.ReadImage('tumorSegm2',sitk.sitkUInt8)
class SurfaceDistanceMeasuresITK(Enum):
    hausdorff_distance, max_surface_distance, avg_surface_distance, median_surface_distance, std_surface_distance = range(5)

class MedpyMetricDists(Enum):
    hausdorff_distance, avg_surface_distance, avg_symmetric_surface_distance = range(3)


  surface_distance_results = np.zeros((1,len(SurfaceDistanceMeasuresITK.__members__.items())))
surface_dists_Medpy = np.zeros((1,len(MedpyMetricDists.__members__.items())))
segmented_surface = sitk.LabelContour(segmentation)

# init signed mauerer distance as reference metrics
reference_distance_map = sitk.Abs(sitk.SignedMaurerDistanceMap(reference_segmentation, squaredDistance=False, useImageSpacing=True))

label_intensity_statistics_filter = sitk.LabelIntensityStatisticsImageFilter()
label_intensity_statistics_filter.Execute(segmented_surface, reference_distance_map)

hausdorff_distance_filter = sitk.HausdorffDistanceImageFilter()
hausdorff_distance_filter.Execute(reference_segmentation, segmentation)

surface_distance_results[0,SurfaceDistanceMeasuresITK.hausdorff_distance.value] = hausdorff_distance_filter.GetHausdorffDistance()
surface_distance_results[0,SurfaceDistanceMeasuresITK.max_surface_distance.value] = label_intensity_statistics_filter.GetMaximum(label)
surface_distance_results[0,SurfaceDistanceMeasuresITK.avg_surface_distance.value] = label_intensity_statistics_filter.GetMean(label)
surface_distance_results[0,SurfaceDistanceMeasuresITK.median_surface_distance.value] = label_intensity_statistics_filter.GetMedian(label)
surface_distance_results[0,SurfaceDistanceMeasuresITK.std_surface_distance.value] = label_intensity_statistics_filter.GetStandardDeviation(label)

surface_distance_results_df = pd.DataFrame(data=surface_distance_results, index = list(range(1)),
                              columns=[name for name, _ in SurfaceDistanceMeasuresITK.__members__.items()])

img_array = sitk.GetArrayFromImage(reference_segmentation)
seg_array = sitk.GetArrayFromImage(segmentation)
# reverse array in the order x, y, z
img_array_rev = np.flip(img_array,2)
seg_array_rev = np.flip(seg_array,2)
vxlspacing = segmentation.GetSpacing()

surface_dists_Medpy[0,MedpyMetricDists.hausdorff_distance.value] = metric.binary.hd(seg_array_rev,img_array_rev, voxelspacing=vxlspacing)
surface_dists_Medpy[0,MedpyMetricDists.avg_surface_distance.value] = metric.binary.asd(seg_array_rev,img_array_rev, voxelspacing=vxlspacing)
surface_dists_Medpy[0,MedpyMetricDists.avg_symmetric_surface_distance.value] = metric.binary.assd(seg_array_rev,img_array_rev, voxelspacing=vxlspacing)

surface_dists_Medpy_df = pd.DataFrame(data=surface_dists_Medpy, index = list(range(1)),
                              columns=[name for name, _ in MedpyMetricDists.__members__.items()])
  1. 乍一看,我不认为SimpleITK会计算出来 对称距离。那个图书馆的人有没有实施?我怎样才能获得它们?

  2. MedPy是一个可靠的图书馆吗?我可以计算对称的根均值 与它同方?

  3. 库的其他建议用于计算表面距离 指标?
  4. 我应该计算Mauerer距离图的绝对值吗?我不确定它会如何影响结果。 reference_distance_map = sitk.Abs(sitk.SignedMaurerDistanceMap(reference_segmentation, squaredDistance=False, useImageSpacing=True))

2 个答案:

答案 0 :(得分:1)

签名距离图不对称。豪斯多夫的距离应该是。

对于网格比较,我过去使用过metro

对于Maurer,正距离表示外部,负距离表示内部。如果你想计算不一致,你应该采取绝对值。

答案 1 :(得分:1)

@Roxanne

我在这里假设您对this SimpleITK notebook中计算的表面距离度量感到困惑?

答案的其余部分涉及该代码。

均值/标准/中位数/最大值不对称(豪斯多夫是)。

使用SimpleITK,您可以计算对称均值和标准差 计算分段的均值和标准差,然后计算参考(代码用于分段,所以只需切换角色,然后将其作为参考)。

现在您有两个样本的平均值和标准偏差。要获得样本的大小,请调用:

label_intensity_statistics_filter.GetNumberOfPixels(label)

计算n1,m1,s1,n2,m2,s2的知识的对称均值和标准差:

m = (n1*m1 + n2*m2)/(n1+n2)
s = np.sqrt((n1*(s1**2+(m1-m)**2) + n2*(s2**2+(m2-m)**2))/(n1+n2))

请注意,标准偏差的样本估计值是偏差版本(类似于numpy.std的默认行为)。

如果您还有其他问题,请发送到ITK discourse forum

相关问题