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

ops/2024/10/10 14:28:13/

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

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

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

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

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

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

import numpy as np# 假设 tumor_array 是你的数据数组
# tumor_array 的形状为(36, 480, 480)# 遍历每张图片
max_nonzero_pixels = 0
max_nonzero_index = Nonefor i in range(label_array.shape[0]):# 计算当前图片中非零像素的数量nonzero_pixels = np.count_nonzero(label_array[i])# 如果当前图片的非零像素数量比之前的最大值大,则更新最大值和对应的索引if nonzero_pixels > max_nonzero_pixels:max_nonzero_pixels = nonzero_pixelsmax_nonzero_index = i# 打印结果
print("最多非零像素的图片索引为:", max_nonzero_index)
print("对应的非零像素数量为:", max_nonzero_pixels)
最多非零像素的图片索引为: 23
对应的非零像素数量为: 574

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

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

roi_array =np.array([label_array[max_nonzero_index]*origin_array[max_nonzero_index - 1],label_array[max_nonzero_index]*origin_array[max_nonzero_index],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博客

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

查看裁剪后的代码

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

 对第三张图像进行可视化

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

 这样就裁剪好了

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

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

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

 对第二张进行可视化

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

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

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

 保存到一个h5文件中


http://www.ppmy.cn/ops/25790.html

相关文章

为什么在Windows窗体项目中采用三层架构(一个项目加两个类库)

在Windows窗体项目中采用三层架构(一个项目加两个类库)是软件开发中常用的架构模式,旨在提高应用程序的可维护性、可扩展性和灵活性。这种架构通常包括以下三层: 表示层(UI层或前端):这是用户与…

QT登录界面,(页面的切换)

以登陆界面为例,(QDialog) 1.主界面先构造login 的对话框类 int main(int argc, char *argv[]) {QApplication a(argc, argv);//先显示Login的界面Study_Login_Dialog login;............ }2.Login的类,可以用自定义的信号&#…

设计模式之监听器模式ListenerPattern(三)

一、介绍 监听器模式是一种软件设计模式,在对象的状态发生改变时,允许依赖它的其他对象获得通知。在Java中,可以使用接口和回调机制来实现监听器模式。 二、代码实例 1、事件Event类 package com.xu.demo.listener;// 事件类 public class…

Week1

1. 题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。…

Git命令行操作(本地操作)

入口 1、任意目录》鼠标右键》Open Git Bash here 2、桌面快捷方式 本地库初始化 在本地库项目文件夹执行命令:git init 验证是否执行成功 .git目录中存放的是本地库相关的子目录和文件,不要删除、修改 设置签名 1、形式 用户名:tom Email地址:GoodMorning@qq.com 2、作…

mysql binlog入门

binlog 什么是binlog binlg记录了所有的表结构变更(CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…),以事件形式记录,还包含语句所执行的消耗的时间。 简单的说就是,只要对…

【unity】(1)场景

Unity的场景(Scene)是构建游戏中各种环境和级别的基础。一个场景可以包含游戏中的所有对象,如角色、道具、地形等。 创建和管理场景 创建新场景: 在Unity编辑器中,选择File > New Scene,或者使用快捷键…

【论文阅读】IPT:Pre-TrainedImageProcessingTransformer

Pre-TrainedImageProcessingTransformer 论文地址摘要1. 简介2.相关作品2.1。图像处理2.2。 Transformer 3. 图像处理3.1. IPT 架构3.2 在 ImageNet 上进行预训练 4. 实验4.1. 超分辨率4.2. Denoising 5. 结论与讨论 论文地址 1、论文地址 2、源码 摘要 随着现代硬件的计算能…