肝臓腫瘍のセクショニングという2つのバイナリオブジェクト間の表面距離メトリックを計算します。私は計算するために探しています:対称表面距離を計算する[Python]
- 平均対称面の距離
- 二乗対称距離に
- ハウスドルフ距離を意味する(また、最大の対称距離として知られている)
は私が助けることができる2つのライブラリを見つけました私はそれらのメトリクスを計算しますが、私は矛盾する結果を得ているので、私は彼らがどのように動作するのか混乱しています。
- SimpleITK:https://itk.org/SimpleITKDoxygen/html/classitk_1_1simple_1_1SignedMaurerDistanceMapImageFilter.html https://itk.org/SimpleITKDoxygen/html/classitk_1_1simple_1_1HausdorffDistanceImageFilter.html
- MedPy: https://github.com/loli/medpy/。 DOCS
これはシンプルな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()])
私はSimpleITKが 対称距離を計算しますとは思いません。そのライブラリ内の実装はありますか?どうすれば入手できますか?
MedPyは信頼できるライブラリですか?対称根平均 を計算することはできますか?
- 表面距離を計算するライブラリのその他の推奨事項 メトリックス?
- Mauerer距離マップの絶対値を計算すべきですか?どのように結果に影響を与えるのか分かりません。
reference_distance_map = sitk.Abs(sitk.SignedMaurerDistanceMap(reference_segmentation, squaredDistance=False, useImageSpacing=True))
もう一度、Mauererの距離を再計算する必要があります。この時間は、マスクの表面からリファレンスセグメンテーションまでですか?参照の輪郭とマスクのMauere距離の間の 'label_intensity_statistics_filter'を再度実行しますか? – Roxanne
はい、あなたは正しいasummingです。私はそのSimpleITKノートブックを使用しています – Roxanne
対称性の必要性は[この質問]でも提起されました(https://discourse.itk.org/t/root-mean-square-surface-distance-mauerer-distances-map-how- to-calculate-it/424)を討論フォーラムに出す。これがあなたでない場合(別の名前で)、答えには対称面距離の更新コードへのリンクが含まれています。 – zivy