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

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

有两个文件,一个是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.rhkb.cn/news/314887.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift - 函数

文章目录 Swift - 函数1. 函数的定义2. 隐式返回(Implicit Return)3. 返回元组:实现多返回值4. 函数的文档注释5. 参数标签(Argument Label)6. 默认参数值(Default Parameter Value)7. 可变参数(Variadic P…

法律知识学习考试系统 C#+uniapp+asp.net微信小程序

技术要求:后端C#,安卓app,mysql数据库 系统分为管理员、教师端和学生端: 管理员端实现管理员的注册登录以及教师和学生的注册、法律法规内容的发布与更新、法律法规页面的评论的添加与删除、内容查询、知识小测的内容发布与删除、问卷调查的发…

Linux:Apache和Nginx的区别

Linux:Apache和Nginx的区别 图示工作过程 apache使用的是进程负责到底的工作流程,其特点是稳定;nginx使用了连接复用器这个结构,可以实现一个进程只负责给存储单元提出需求,而不需要负责到底,这样大大提高…

[蓝桥杯2024]-PWN:fd解析(命令符转义,标准输出重定向)

查看保护 查看ida 这里有一次栈溢出,并且题目给了我们system函数。 这里的知识点没有那么复杂 完整exp: from pwn import* pprocess(./pwn) pop_rdi0x400933 info0x601090 system0x400778payloadb"ca\\t flag 1>&2" print(len(paylo…

贪心算法在单位时间任务调度问题中的应用

贪心算法在单位时间任务调度问题中的应用 一、引言二、问题描述与算法设计三、算法证明四、算法实现与效率分析五、C语言实现示例六、结论 一、引言 单位时间任务调度问题是一类经典的优化问题,旨在分配任务到不同的时间槽中,使得某种性能指标达到最优。…

决策树学习笔记

一、衡量标准——熵 随机变量不确定性的度量 信息增益:表示特征X使得类Y的不确定性减少的程度。 二、数据集 14天的打球情况 特征:4种环境变化(天气、温度等等) 在上述数据种,14天中打球的天数为9天;不…

Linux centos stream9 htop

Linux中,top动态查看进程。而htop是top的增强版本,功能更加强大,操作也更方便。 一、htop功能 htop命令是一个Linux实用程序,用于显示有关系统进程的关键信息。它可以被看作是Windows任务管理器的Linux版本。htop更像是一个交互式程序,因为它支持鼠标和键盘操作来在值和…

循迹/跟随/摇头避障小车

循迹小车 智能小车2-循迹小车-CSDN博客 接线 B-1A -- PB0 B-1B -- PB1 A-1A -- PB2 A-1B -- PB10 循迹模块(左) -- PB3 循迹模块(右) -- PB4 CubeMx 在CubeMx配置,并重定义,在main.h会自动生成 #define B_1A_Pin GPIO_PIN_0 #define B_1A_GPIO_Port GPIOB #defi…

上位机图像处理和嵌入式模块部署(树莓派4b下使用sqlite3)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 嵌入式设备下面,有的时候也要对数据进行处理和保存。如果处理的数据不是很多,一般用json就可以。但是数据如果量比较大&…

TCP/IP协议族中的TCP(一):解析其关键特性与机制

⭐小白苦学IT的博客主页⭐ ⭐初学者必看:Linux操作系统入门⭐ ⭐代码仓库:Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 前言 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字…

深度学习从入门到精通——词向量介绍及应用

词向量介绍 词向量(Word embedding),即把词语表示成实数向量。“好”的词向量能体现词语直接的相近关系。词向量已经被证明可以提高NLP任务的性能,例如语法分析和情感分析。词向量与词嵌入技术的提出是为了解决onehot的缺陷。它把…

debian配置BIND DNS服务器

前言 局域网内有很多台主机,IP难以记忆。 而修改hosts文件又难以做到配置共享和统一,需要一台内网的DNS服务器。 效果展示 这里添加了一个域名hello.dog,将其指向为192.168.1.100。 同时,外网的域名不会受到影响,…

力扣48. 旋转图像

Problem: 48. 旋转图像 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化&#xff1a;首先&#xff0c;我们需要获取矩阵的长度len&#xff0c;这将用于后续的索引计算。 2.外层循环&#xff1a;我们使用一个外层循环for (int i 0; i < len / 2; i)来遍历矩阵的每一…

关于加强电力系统通信与电网调度自动化建设问题的规定

关于加强电力系统通信与电网调度自动化建设问题的规定 为了保障电力系统安全、经济、优质、可靠运行&#xff0c;必须加强电网调度管理和提高技术装备水平。根据当前电网技术装备状况&#xff0c;结合电力系统通信和电网调度自动化的特点&#xff0c;以及今后规划发展的要求&am…

SpringBoot---------Hutool

第一步&#xff1a;引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-parent</artifactId><version>5.7.17</version></dependency> 第二步&#xff1a;各种用法 ①生成随机数 //生成验证码 String s …

Docker常用命令(镜像、容器)

一、镜像 1.1 存出镜像 1.2 载入镜像 1.3 上传镜像 二、容器 2.1 容器创建 2.2 查看容器的运行状态 ​2.3 启动容器 2.4 创建并启动容器 2.5 在后台持续运行 docker run 创建的容器 2.6 终止容器运行 2.7 容器的进入 ​2.8把宿主机的文件传入到容器内部 2.9 从容器…

vite和webpacke的常规配置

文章目录 1、vite和webpacke的区分2、vite的常规配置介绍主要部分介绍vite基本配置示例 3、webpacke的常规配置介绍主要部分介绍Webpack 基本配置示例 1、vite和webpacke的区分 相同点&#xff1a; 都是构建工具&#xff0c;用于资源打包 &#xff1b; 都有应用到摇树原理 tre…

PUBG绝地求生进游戏就闪退 绝地求生进游戏慢?3个解决方法分享

《绝地求生》(PUBG) 是由韩国Krafton工作室开发的一款战术竞技型射击类沙盒游戏。2022年1月12日&#xff0c;该游戏于主机和PC上可免费下载游玩。在该游戏中&#xff0c;玩家需要在游戏地图上收集各种资源&#xff0c;并在不断缩小的安全区域内对抗其他玩家&#xff0c;让自己生…

袁庭新ES系列15节|Elasticsearch客户端基础操作

前言 上一章节我们介绍了搭建Elasticsearch集群相关的知识。那么又该如何来操作Elasticsearch集群呢&#xff1f;在ES官网中提供了各种语言的客户端&#xff0c;我们在项目开发过程中有多种Elasticsearch版本和连接客户端可以选择&#xff0c;那么他们有什么区别&#xff1f;这…

appium相关的知识

>adb shell dumpsys window | findstr mCurrentFocus adb devices # 实例化字典 desired_caps = dict() desired_caps[platformName] = Android desired_caps[platformVersion] = 9 # devices desired_caps[deviceName] = emulator-5554 # 包名 desired_caps[appPackage] …