2017-11-14 27 views
0

肝臓腫瘍のセクショニングという2つのバイナリオブジェクト間の表面距離メトリックを計算します。私は計算するために探しています:対称表面距離を計算する[Python]

  • 平均対称面の距離
  • 二乗対称距離に
  • ハウスドルフ距離を意味する(また、最大の対称距離として知られている)

は私が助けることができる2つのライブラリを見つけました私はそれらのメトリクスを計算しますが、私は矛盾する結果を得ているので、私は彼らがどのように動作するのか混乱しています。

これはシンプルな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))

答えて

1

@Roxanne

私はあなたがthis SimpleITK notebookで計算表面までの距離を測定することにより、混同されていることを、ここで想定していますか?

残りの回答はそのコードを参照しています。

平均/標準偏差/中央値/最大値は対称ではありません(Hausdorffは)。あなたは、セグメンテーションのための平均値と標準偏差を計算する によって対称平均値と標準偏差を計算して、参考のために(コードはセグメンテーションのためにそれをしない、これだけの役割を切り替えて、あなたがそれを得ることができるSimpleITKを使用

参照)。

ここでは、2つのサンプルの平均と標準偏差があります。サンプルのサイズを取得するには、単に呼び出す:

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に投稿してください。

+0

もう一度、Mauererの距離を再計算する必要があります。この時間は、マスクの表面からリファレンスセグメンテーションまでですか?参照の輪郭とマスクのMauere距離の間の 'label_intensity_statistics_filter'を再度実行しますか? – Roxanne

+0

はい、あなたは正しいasummingです。私はそのSimpleITKノートブックを使用しています – Roxanne

+0

対称性の必要性は[この質問]でも提起されました(https://discourse.itk.org/t/root-mean-square-surface-distance-mauerer-distances-map-how- to-calculate-it/424)を討論フォーラムに出す。これがあなたでない場合(別の名前で)、答えには対称面距離の更新コードへのリンクが含まれています。 – zivy

1

符号付き距離マップは対称ではありません。ハウスドルフ距離はすべきです。

メッシュ比較では、これまではmetroを使用していました。

マウラーの場合、正の距離は外側を意味し、負の距離は内側を意味します。不一致を計算したい場合は絶対値を取るべきです。