2017-11-14 34 views
0

간 종양의 분류라고 불리는 2 개의 이진 객체 간 표면 거리 메트릭을 계산하고 싶습니다. 나는 계산하기 위해 찾고 있어요 :대칭 표면 거리 계산 [Python]

  • 평균 대칭 표면 거리
  • 루트 평방 대칭 거리를
  • 하우스 도르프 거리를 의미한다 (또한 최대 대칭 거리라고도 함)

내가 도울 수있는 두 개의 라이브러리를 발견 이 측정 기준을 계산하지만 충돌하는 결과가 발생하므로 어떻게 작동하는지 혼란 스럽습니다.

이것은 간단한 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를 사용하면 세그먼트 화에 대한 평균 및 표준 편차를 계산하여 대칭 평균 및 표준 편차를 계산할 수 있습니다 (코드는 세그먼트 화를 수행하므로 역할을 바꿔서 참고).

이제 두 샘플의 평균과 표준 편차가 있습니다. 샘플의 크기를 얻으려면 바로 전화 :

label_intensity_statistics_filter.GetNumberOfPixels(label) 

는 N1의 knowlege에서 대칭 평균과 표준 편차를 계산하기 위해, 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

예, 당신은 옳았어요. 나는 그 SimpleITK 노트를 사용하고있다 – Roxanne

+0

대칭의 필요성은 [이 질문] (https://discourse.itk.org/t/root-mean-square-surface-distance-mauerer-distances-map-how- to-calculate-it/424)을 담은 토론 포럼에서 이 이름이 다른 이름이 아니라면 대칭 표면 거리에 대한 업데이트 된 코드에 대한 링크가 포함됩니다. – zivy

1

부호가있는 거리지도는 대칭이 아닙니다. Hausdorff 거리가 있어야합니다.

메시 비교를 위해 나는 과거에 metro을 사용했습니다.

Maurer의 경우 양의 거리는 바깥 쪽을 나타내고 음의 거리는 안쪽을 의미합니다. 불일치를 계산하려면 절대 값을 가져야합니다.