特别版:更正:SimpleITK计算dice系数及Hausdorff距离(python代码)

Penelope ·
更新时间:2024-09-21
· 891 次阅读

相比其他只是复制粘贴的,我只想说,为什么没有人说这可以直接比较图片而是都去比较array。

其实是可以直接比较两张图片直接的dice,distance的,只要能被sitk.ReadImage读取进来。不需要sitk.GetImageFromArray或者hausdorffcomputer.Execute(labelTrue>0.5,labelPred>0.5)的额外处理。这两个步骤只是用来把array回复成image,并做灰度处理得到两分图片。如果你的原始输入数据就是二分图片,就不需要,只要读取进来即可。

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 17 09:50:56 2020

@author: bpk1036
"""

import numpy as np
import os
import SimpleITK as sitk
 
def file_name(file_dir):   
   L=[]   
   path_list = os.listdir(file_dir)
   path_list.sort() # sort the read path
   for filename in path_list:
       if 'nii' in filename:
            L.append(os.path.join(filename))   
   return L 
 
def computeQualityMeasures(lP,lT):
    quality=dict()
#    labelPred=sitk.GetImageFromArray(lP,isVector=False)
#    labelTrue=sitk.GetImageFromArray(lT,isVector=False)
#    labelPred=sitk.GetArrayFromImage(lP)
#    labelTrue=sitk.GetArrayFromImage(lT) 
    labelTrue = lP
    labelPred = lT
    hausdorffcomputer=sitk.HausdorffDistanceImageFilter()
    hausdorffcomputer.Execute(labelTrue,labelPred)
    quality["avgHausdorff"]=hausdorffcomputer.GetAverageHausdorffDistance()
    quality["Hausdorff"]=hausdorffcomputer.GetHausdorffDistance()
 
    dicecomputer=sitk.LabelOverlapMeasuresImageFilter()
    dicecomputer.Execute(labelTrue,labelPred)
    quality["dice"]=dicecomputer.GetDiceCoefficient()
 
    return quality
 
gtpath = 'C:/research/image analysis/gtpath'
predpath = 'C:/research/image analysis/predpath'

gtnames = file_name(gtpath)
prednames = file_name(predpath)

 
for i in range(len(gtnames)):
 
    gt = sitk.ReadImage(gtpath +'/'+ gtnames[i])
    pred = sitk.ReadImage(predpath +'/'+ prednames[i])    
    quality = computeQualityMeasures(pred,gt)
    


    
    


作者:Jack千斤顶



dice Python

需要 登录 后方可回复, 如果你还没有账号请 注册新账号