【Python】SimpleITK 针对于 LiTS 数据集,获取最大肝脏面积的切片

2023-05-16

效果图
在这里插入图片描述

文章目录

    • 1. window_transform
    • 2. extract_max_slice
    • 3. extract_max_slice_with_seg

1. window_transform

可以让图片更好看一点

def window_transform(ct_array, windowWidth=400, windowCenter=40, normal=False):
    """
    return: trucated image according to window center and window width
    and normalized to [0,1]
    """
    minWindow = float(windowCenter) - 0.5 * float(windowWidth)
    newing = (ct_array - minWindow) / float(windowWidth)
    newing[newing < 0] = 0
    newing[newing > 1] = 1
    # 将值域转到0-255之间,例如要看头颅时, 我们只需将头颅的值域转换到 0-255 就行了
    if not normal:
        newing = (newing * 255).astype('uint8')
    return newing

2. extract_max_slice

获取最大肝脏面积的CT切片

def extract_max_slice(ct_path, seg_path, img_save_path=None):
    """
    根据标注获取最大肝脏切片
    """
    # 读取标注的肝脏图像
    seg_nii = sitk.ReadImage(seg_path)
    seg_img = sitk.GetArrayFromImage(seg_nii)

    # 获取肝脏图像面积最大的切片的索引
    index = np.argmax(seg_img.sum((1, 2)))

    # 读取CT图像
    ct_nii = sitk.ReadImage(ct_path)
    ct_img = sitk.GetArrayFromImage(ct_nii)

    # 截取CT图像中肝脏最大的切片
    img = ct_img[index, :, :]
    img = window_transform(img)

    # 保存图片
    if img_save_path is not None:
        save_name = os.path.basename(ct_path).split(".")[0] + "-index" + str(index) + ".png"
        cv2.imwrite(os.path.join(img_save_path, save_name), img)

效果图

请添加图片描述

3. extract_max_slice_with_seg

获取最大肝脏面积的CT切片,并且用红色标记处肝脏的位置

def extract_max_slice_with_seg(ct_path, seg_path, img_save_path=None):
    """
    根据标注获取带有标注的最大肝脏切片
    """
    # 读取标注的肝脏图像
    seg_nii = sitk.ReadImage(seg_path, sitk.sitkFloat32)
    seg_img = sitk.GetArrayFromImage(seg_nii)

    # 获取肝脏图像面积最大的切片的索引
    index = np.argmax(seg_img.sum((1, 2)))

    # 读取CT图像
    ct_nii = sitk.ReadImage(ct_path)
    ct_img = sitk.GetArrayFromImage(ct_nii)

    # 截取CT图像中肝脏最大的切片
    ext_ct_img = ct_img[index, :, :]
    ext_seg_img = seg_img[index, :, :]

    ext_ct_img = window_transform(ext_ct_img)  # 映射后图片效果更好
    ext_ct_img = np.array(ext_ct_img)

    ext_ct_img = cv2.cvtColor(np.array(ext_ct_img), cv2.COLOR_GRAY2RGB)

    # 肝脏位置标记颜色
    for i in range(512):
        for j in range(512):
            if ext_seg_img[i][j] >= 1.0:
                ext_ct_img[i][j][0] = 97
                ext_ct_img[i][j][1] = 100
                ext_ct_img[i][j][2] = 255

    # 保存图片
    if img_save_path is not None:
        save_name = os.path.basename(ct_path).split(".")[0] + "-index" + str(index) + ".png"
        cv2.imwrite(os.path.join(img_save_path, save_name), ext_ct_img)

效果图

请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】SimpleITK 针对于 LiTS 数据集,获取最大肝脏面积的切片 的相关文章

随机推荐