当前位置:   article > 正文

根据标签最大层面ROI提取原始图像区域

根据标签最大层面ROI提取原始图像区域

今天要实现的任务是提取肿瘤的感兴趣区域。

有两个文件,一个是nii的原始图像文件,一个是nii的标签文件。

我们要实现的是:在标签文件上选出最大层面,然后把最大层面的ROI映射到原始图像区域,在原始图像上提裁剪出ROI区域,然后根据这个ROI,在其上面一层和下面一层,共裁剪出三张原始图像。

将原始图像和标签图像的像素值提取出来

  1. # 读取原始NII文件
  2. image_origin = sitk.ReadImage(r"C:\Users\Administrator\Desktop\Breast\AN_HAI_YING_DCE.nii")
  3. # 读取标签NII文件
  4. image_label = sitk.ReadImage(r"C:\Users\Administrator\Desktop\Breast\AN_HAI_YING_label.nii")
  5. # 转换为NumPy数组
  6. origin_array = sitk.GetArrayFromImage(image_origin)
  7. label_array = sitk.GetArrayFromImage(image_label)
  8. #提取像素值
  9. origin_array = np.array([origin_array[i] for i in range(origin_array.shape[0])])
  10. label_array = np.array([label_array[i] for i in range(label_array.shape[0])])
  1. print(origin_array.shape)
  2. print(label_array.shape)
(36, 480, 480)
(36, 480, 480)

 筛选出标签图像中不为0的像素值最多的那张图像,就是层面最大的图像。

  1. import numpy as np
  2. # 假设 tumor_array 是你的数据数组
  3. # tumor_array 的形状为(36, 480, 480
  4. # 遍历每张图片
  5. max_nonzero_pixels = 0
  6. max_nonzero_index = None
  7. for i in range(label_array.shape[0]):
  8. # 计算当前图片中非零像素的数量
  9. nonzero_pixels = np.count_nonzero(label_array[i])
  10. # 如果当前图片的非零像素数量比之前的最大值大,则更新最大值和对应的索引
  11. if nonzero_pixels > max_nonzero_pixels:
  12. max_nonzero_pixels = nonzero_pixels
  13. max_nonzero_index = i
  14. # 打印结果
  15. print("最多非零像素的图片索引为:", max_nonzero_index)
  16. print("对应的非零像素数量为:", max_nonzero_pixels)
最多非零像素的图片索引为: 23
对应的非零像素数量为: 574

 说明第23张图像是ROI层面最大的图像,(准确应该是第24张,因为从0开始)

 根据最大层面的ROI,映射到对应的原始图像中,以及上一层和下一层。

  1. roi_array =np.array([label_array[max_nonzero_index]*origin_array[max_nonzero_index - 1],
  2. label_array[max_nonzero_index]*origin_array[max_nonzero_index],
  3. label_array[max_nonzero_index]*origin_array[max_nonzero_index + 1]])
roi_array.shape
(3, 480, 480)
plt.imshow(roi_array[1],cmap='gray')

 然后再剔除周围的0像素

参考去除图像周围的0像素,调整大小-CSDN博客

  1. def trim_image(image):
  2. # 转换为numpy数组
  3. image_array = np.array(image)
  4. # 找到非零像素的边界
  5. non_zero_indices = np.nonzero(image_array)
  6. min_row = np.min(non_zero_indices[0])
  7. max_row = np.max(non_zero_indices[0])
  8. min_col = np.min(non_zero_indices[1])
  9. max_col = np.max(non_zero_indices[1])
  10. min_depth = np.min(non_zero_indices[2])
  11. max_depth = np.max(non_zero_indices[2])
  12. # 裁剪图像
  13. cropped_image_array = image_array[min_row:max_row + 1, min_col:max_col + 1, min_depth:max_depth + 1]
  14. return cropped_image_array

查看裁剪后的代码

trim_image(roi_array).shape
(3, 31, 26)

 对第三张图像进行可视化

plt.imshow(trim_image(roi_array)[2],cmap='gray')

 这样就裁剪好了

然后使用双向线性插值调整图像的大小

参考 最邻近插值和线性插值-CSDN博客

  1. from PIL import Image
  2. import torch
  3. import torch.nn.functional as F
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. image_tensor = torch.tensor(finish_array, dtype=torch.float32).unsqueeze(0)
  7. # 目标图像大小
  8. target_height, target_width =224,224
  9. # 使用双线性插值角对齐对图像进行缩放
  10. output_bilinear_corners_True = F.interpolate(image_tensor, size=(target_height, target_width), mode='bilinear', align_corners=True)
  11. # 将张量转换回 numpy 数组
  12. output_bilinear_corners_True_array = output_bilinear_corners_True.squeeze().numpy().astype(np.uint8)

 对第二张进行可视化

plt.imshow(output_bilinear_corners_True_array[2],cmap='gray')

 然后就可以将处理好的图像保存

  1. import h5py
  2. # 假设 output_bilinear_corners_True_array 是你处理好的数组
  3. # 另外假设你的数组的形状为 (channel, height, width)
  4. # 创建一个 HDF5 文件
  5. with h5py.File(r"C:\Users\Administrator\Desktop\Breast\output_bilinear_corners_True.h5", "w") as hf:
  6. # 将数组写入 HDF5 文件中
  7. hf.create_dataset("output_array", data=output_bilinear_corners_True_array)

 保存到一个h5文件中

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/541814
推荐阅读
相关标签
  

闽ICP备14008679号