图像分割——Dice系数

文章目录

  • 图像分割——Dice系数
    • Dice定义
    • Dice系数的python实现

图像分割——Dice系数

在预测脑肿瘤或者皮肤病变的mask模型中,我们一般将mask图像中的像素分类成1或0,即如果像素中有mask,我们声明为1,如果像素中没有mask,我们声明为0,这种对图像进行逐像素二进制分类称为“语义分割”。
如果我们试图去识别图像中的许多对象,则称为“实例分割”,实例分割是一种多分类分割。例如,在自动驾驶汽车视野中,物体被分类为汽车、道路、树木、房屋、天空、行人等。
在语义(二进制)分割和实例(多类)分割中,我们需要一个损失函数来计算梯度。

Dice定义

Dice系数是一种集合相似度度量函数,通常用于计算两个样本的相似度,取值为[0,1]。
图像分割——Dice系数_第1张图片

在上图中,ground truth为金标准,即理论分割结果的图像,一般是通过专家手工勾画出来得到的理论值; predicted为预测的分割结果图像。

Dice系数的python实现

下列给出求一套数据的dice和批量求dice的python代码

import shutil
import SimpleITK as sitk
from medpy.metric import dc
import numpy as np
from scipy.ndimage import label

def calculate_dice(seg_path,pred_path):
    seg = sitk.ReadImage(seg_path)
    seg_arr = sitk.GetArrayFromImage(seg)
    pred = sitk.ReadImage(pred_path)
    pred_arr = sitk.GetArrayFromImage(pred)
    label = [1]   #这里求得是label=1的dice,需要根据实际情况修改
    dice = []
    for i in range(len(label)):
        intersection = np.sum((seg_arr == label[i])*(pred_arr == label[i]))
        union = np.sum(pred_arr == label[i])+np.sum(seg_arr == label[i])
        dice.append(2*intersection/union)
    return np.mean(dice)

#求一套数据的dice
seg_path = 'E:/segmentation.nii.gz'   #ground truth的路径
pred_path = 'C:/case30.nii.gz'   #预测图像的路径
print(calculate_dice(seg_path,pred_path))

#批量求dice,先把路径保存为txt格式,再一个一个读取
seg_path = 'E:/label_list.txt'  #保存ground truth的文本路径
pred_path = 'E:/pred_list_c++.txt'  #保存预测图像的文本路径
dice = []
seg_opens = open(seg_path)
pred_opens = open(pred_path)
seg_files = seg_opens.readlines()
pred_files = pred_opens.readlines()
for i in range(len(seg_files)):
    seg_files[i] = seg_files[i].strip('\n')
    pred_files[i] = pred_files[i].strip('\n')
    dice.append(calculate_dice(seg_files[i],pred_files[i]))
    print(calculate_dice(seg_files[i], pred_files[i]))
print(np.mean(dice))

你可能感兴趣的:(图像分割,python,深度学习,机器学习,数据挖掘,计算机视觉)