图像分割结果的评估---DICE参数

GT(ground truth)图像:我理解的就是含有理论分割结果的图像,用来和结果图像进行比较的参照图像。那么GT图像怎么来,一般通过专家手工勾画出来,得到理论值。当然为避免偶然性,你可以选择多个专家,得到多个GT分割结果,取各项评估参数的平均值。

分割精度:个人理解就是分割准确的面积占GT图像中真实面积的百分比。找了半天找了这么个公式(如下)。

 

不难理解,其中Rs表示专家手工勾画出的分割图像的参考面积,Ts表示算法分割得到的图像的真实面积,|Rs-Ts|表示错误分割的像素点个数。

过分割率:即分割在GT图像参考面积之外的像素点的比率,计算公式如下:

 

含义同上,Os表示本不应该包含在分割结果中的像素点个数,实际却在分割结果中的像素点个数。换句话讲,Os中的像素点出现在实际分割图像中,但不出现在理论分割图像Rs中。

欠分割率:即分割在GT图像参考面积之中欠缺的像素点的比率,计算的公式如下:

 

含义同上,Us表示本应该包含在分割结果中的像素点个数,实际却不在分割结果中的像素点个数。换句话讲,Us中的像素点出现在理论分割图像中,但不出现在实际分割图像中。

代码(由于当时时间紧张,很多可以封装成函数):

获得肝血管GT图像:

import pydicom
from pylab import *
import os
import PIL.Image as image
from Anisotropicdiffusion import *

PathDicom = "./PATIENT_DICOM20/"  # 与python文件同一个目录下的文件夹
lstFilesDCM1 = []
number1 = 0
for dirName, subdirList, fileList1 in os.walk(PathDicom):
    for filename in fileList1:
        lstFilesDCM1.append(os.path.join(dirName, filename))
        number1 += 1

RefDs = pydicom.read_file(lstFilesDCM1[0])
ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness))
print(ConstPixelSpacing)

PathDicom = "./liver20/"  # 与python文件同一个目录下的文件夹
lstFilesDCM2 = []
number2 = 0
for dirName, subdirList, fileList2 in os.walk(PathDicom):
    for filename in fileList2:
        lstFilesDCM2.append(os.path.join(dirName, filename))
        number2 += 1

PathDicom = "./artery20/"  # 与python文件同一个目录下的文件夹
lstFilesDCM3 = []
number3 = 0
for dirName, subdirList, fileList3 in os.walk(PathDicom):
    for filename in fileList3:
        lstFilesDCM3.append(os.path.join(dirName, filename))
        number3 += 1

PathDicom = "./portalvein20/"  # 与python文件同一个目录下的文件夹
lstFilesDCM4 = []
number4 = 0
for dirName, subdirList, fileList4 in os.walk(PathDicom):
    for filename in fileList4:
        lstFilesDCM4.append(os.path.join(dirName, filename))
        number4 += 1

PathDicom = "./venacava20/"  # 与python文件同一个目录下的文件夹
lstFilesDCM5 = []
number5 = 0
for dirName, subdirList, fileList5 in os.walk(PathDicom):
    for filename in fileList5:
        lstFilesDCM5.append(os.path.join(dirName, filename))
        number5 += 1

if number1 != number2:
    print("fileerro")

for i in range(number1):
    dcm1 = pydicom.read_file(lstFilesDCM1[i])
    dcm1.image = dcm1.pixel_array * dcm1.RescaleSlope + dcm1.RescaleIntercept
    slices = []
    slices.append(dcm1)
    img1 = slices[int(len(slices) / 2)].image.copy()

    dcm2 = pydicom.read_file(lstFilesDCM2[i])
    dcm2.image = dcm2.pixel_array * dcm2.RescaleSlope + dcm2.RescaleIntercept
    slices = []
    slices.append(dcm2)
    img2 = slices[int(len(slices) / 2)].image.copy()

    dcm3 = pydicom.read_file(lstFilesDCM3[i])
    dcm3.image = dcm3.pixel_array * dcm3.RescaleSlope + dcm3.RescaleIntercept
    slices = []
    slices.append(dcm3)
    img3 = slices[int(len(slices) / 2)].image.copy()

    dcm4 = pydicom.read_file(lstFilesDCM4[i])
    dcm4.image = dcm4.pixel_array * dcm4.RescaleSlope + dcm4.RescaleIntercept
    slices = []
    slices.append(dcm4)
    img4 = slices[int(len(slices) / 2)].image.copy()

    dcm5 = pydicom.read_file(lstFilesDCM5[i])
    dcm5.image = dcm5.pixel_array * dcm5.RescaleSlope + dcm5.RescaleIntercept
    slices = []
    slices.append(dcm5)
    img5 = slices[int(len(slices) / 2)].image.copy()

    img = np.zeros((512, 512))
    img30 = np.zeros((512, 512))
    img40 = np.zeros((512, 512))
    img50 = np.zeros((512, 512))
    height, width = img2.shape
    for k in range(height):
        for j in range(width):
            if img2[k, j] != 0:
                img2[k, j] = 1
            if img3[k, j] != 0:
                img3[k, j] = 1
            if img4[k, j] != 0:
                img4[k, j] = 1
            if img5[k, j] != 0:
                img5[k, j] = 1
            img1[k, j] *= img2[k, j]
            img30[k, j] = img1[k, j]*img3[k, j]
            img40[k, j] = img1[k, j]*img4[k, j]
            img50[k, j] = img1[k, j]*img5[k, j]
            img[k, j] = img30[k, j]+img40[k, j]+img50[k, j]

    img = np.uint8(img)
    img6 = image.fromarray(img)
    filename = "D:/Pychram/liverpicture/mask_" + fileList1[i] + ".png"
    img6.save(filename)
    print(i)

计算分割精度:

import os
import PIL.Image as Image
from Anisotropicdiffusion import *

PathDicom = "C:\\Users\\LCSH\\Desktop\\Pychram\\liverpicture"  # 与python文件同一个目录下的文件夹
lstFilesDCM1 = []
number1 = 0
for dirName, subdirList, fileList1 in os.walk(PathDicom):
    for filename in fileList1:
        lstFilesDCM1.append(os.path.join(dirName, filename))
        number1 += 1

PathDicom = "C:\\Users\\LCSH\\Desktop\\Pychram\\liverpicture1"  # 与python文件同一个目录下的文件夹
lstFilesDCM2 = []
number2 = 0
for dirName, subdirList, fileList2 in os.walk(PathDicom):
    for filename in fileList2:
        lstFilesDCM2.append(os.path.join(dirName, filename))
        number2 += 1

p = 0
for i in range(number1):
    img = Image.open(lstFilesDCM1[i])
    img1 = img.load()
    img = Image.open(lstFilesDCM2[i])
    img2 = img.load()

    f = h = 0
    height, width = img.size
    for k in range(height):
        for j in range(width):
            if img1[k, j] > 0:
               f += 1
            if img1[k, j] > 0 and img2[k, j] == 0:
               h += 1
    g = h/f
    p += g
    print(i)
L = p / number1
print(L)

 

  • 9
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
U-Net是一种基于卷积神经网络的图像分割模型,广泛应用于医学图像分割领域。下面,我将为您介绍一些U-Net的医学图像分割实战。 首先,我们需要准备医学图像数据集。医学图像通常是二维或三维的,比如CT扫描、MRI、X射线等。可以从公共数据集中下载这些图像数据集,如Kaggle、TCIA、MICCAI等。 接下来,我们需要设计U-Net模型。U-Net模型由编码器和解码器组成,编码器将输入图像缩小到较小的特征图,解码器将特征图放大到原始图像大小并输出分割结果。U-Net使用跳跃连接(skip connections)将编码器和解码器层级连接在一起,这有助于解决神经网络训练中的梯度消失问题。 然后,我们需要对图像进行预处理,如裁剪、缩放、归一化等操作,以便让模型更好地处理图像。在训练过程中,我们可以使用数据增强技术,如旋转、翻转、随机裁剪等方法,以增加数据样本的多样性,从而提高模型的鲁棒性。 最后,我们可以使用一些评估指标来评估模型的性能,如Dice系数、Jaccard系数、准确、召回等指标。可以使用交叉验证等技术来评估模型的鲁棒性和泛化性能。 总的来说,U-Net在医学图像分割领域具有广泛的应用,可以用来分割肿瘤、器官、血管等结构。通过实践,我们可以更好地理解U-Net模型的原理和应用,并掌握医学图像分割的技术。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GlassySky0816

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值