效果图

文章目录

               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)

效果图