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

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

有两个文件,一个是nii的原始图像文件,一个是nii的标签文件。我们要实现的是:在标签文件上选出最大层面,然后把最大层面的ROI映射到原始图像区域,在原始图像上提裁剪出ROI区域,这次裁剪的方法和上期的不同,上次是将ROI的整个边界区域提取出来,插值到224*224。这次是在标签上找到勾画ROI的最多的那一层,找到这个ROI区域的中心点在整个图像的坐标,然后根据这个坐标在映射到原始图像上,向四周延申出224*224大小的图像。这就不能保证勾画的边界。

import os
import SimpleITK as sitk
import numpy as np'''
这个脚本是根据ROI的中心坐标来映射到原图像上,裁剪出大小为224*224的图像,超出区域用0填充
如果需要保存上下共三个层面,中心点还是使用的最大层面ROI的中心坐标,因为往上往下一层可能没有勾画,就会报错
'''label_path= r"C:\Users\Administrator\Desktop\Breast\benign_label\AN_YU_MEI-label.nii"
image_path = r"C:\Users\Administrator\Desktop\Breast\benign\DCE\AN_YU_MEI.nii"# 找出勾画ROI数值最多的那一层
def max_index(label_array):# 遍历每张图片max_nonzero_pixels = 0max_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 = ireturn max_nonzero_index# 根据勾画的ROI,找到其中心坐标
def find_roi_center(max_label):# 找到所有 ROI 区域的索引indices = np.where(max_label == 1)# 计算中心点坐标center_x = int(np.round(np.mean(indices[0])))center_y = int(np.round(np.mean(indices[1])))return (center_x, center_y)# 根据找到的中心点坐标,以此为中心,映射到原图上,向四周延申到224*224
def crop_roi(max_image, roi_center):# 计算裁剪区域的边界坐标x_min = max(0, roi_center[0] - 112)x_max = min(max_image.shape[0], roi_center[0] + 112)y_min = max(0, roi_center[1] - 112)y_max = min(max_image.shape[1], roi_center[1] + 112)# 创建一个空的224x224大小的数组,并用0填充cropped_image = np.zeros((224, 224))# 计算裁剪区域在目标数组中的位置cropped_x_min = max(0, 112 - (roi_center[0] - x_min))cropped_x_max = cropped_x_min + min(x_max - x_min, 224)cropped_y_min = max(0, 112 - (roi_center[1] - y_min))cropped_y_max = cropped_y_min + min(y_max - y_min, 224)# 将ROI区域复制到裁剪图像中cropped_image[cropped_x_min:cropped_x_max, cropped_y_min:cropped_y_max] = max_image[x_min:x_max, y_min:y_max]return cropped_image
# 读取标签和原始图像
image_label = sitk.ReadImage(label_path)
# 读取原始NII文件
image_origin = sitk.ReadImage(image_path)# 转换为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])])
# 找到最大值的索引
max_index = max_index(label_array)
# 找出标签中勾画ROI最多的那张图像
max_image = origin_array[max_index]
max_label =label_array[max_index]
#找到ROI的中心点
roi_center = find_roi_center(max_label)
# 根据中心点坐标向四周延伸裁剪出224*224
cropped_image = crop_roi(max_image, roi_center)print("裁剪后的图像:\n", cropped_image.shape)
print("ROI 中心点坐标:", roi_center)

如果需要保存三个层面则运行以下函数

def three_image(max_index):max_label0 = label_array[max_index-1]max_label1 = label_array[max_index]max_label2 = label_array[max_index+1]max_image0 = origin_array[max_index-1]max_image1 = origin_array[max_index]max_image2 = origin_array[max_index+1]# 找到ROI的中心点#roi_center0 = find_roi_center(max_label0)roi_center1 = find_roi_center(max_label1)#roi_center2 = find_roi_center(max_label2)# 根据中心点坐标向四周延伸裁剪出224*224cropped_image0 = crop_roi(max_image0, roi_center1)cropped_image1 = crop_roi(max_image1, roi_center1)cropped_image2 = crop_roi(max_image2, roi_center1)# 将三个图像数组堆叠成一个新的数组stacked_images = np.stack((cropped_image0, cropped_image1, cropped_image2))return stacked_imagesimages = three_image(max_index)
print("保存了三个层面的图像:", images.shape )

全部代码

import os
import SimpleITK as sitk
import numpy as np'''
这个脚本是根据ROI的中心坐标来映射到原图像上,裁剪出大小为224*224的图像,超出区域用0填充
如果需要保存上下共三个层面,中心点还是使用的最大层面ROI的中心坐标,因为往上往下一层可能没有勾画,就会报错
'''label_path= r"C:\Users\Administrator\Desktop\Breast\benign_label\AN_YU_MEI-label.nii"
image_path = r"C:\Users\Administrator\Desktop\Breast\benign\DCE\AN_YU_MEI.nii"# 找出勾画ROI数值最多的那一层
def max_index(label_array):# 遍历每张图片max_nonzero_pixels = 0max_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 = ireturn max_nonzero_index# 根据勾画的ROI,找到其中心坐标
def find_roi_center(max_label):# 找到所有 ROI 区域的索引indices = np.where(max_label == 1)# 计算中心点坐标center_x = int(np.round(np.mean(indices[0])))center_y = int(np.round(np.mean(indices[1])))return (center_x, center_y)# 根据找到的中心点坐标,以此为中心,映射到原图上,向四周延申到224*224
def crop_roi(max_image, roi_center):# 计算裁剪区域的边界坐标x_min = max(0, roi_center[0] - 112)x_max = min(max_image.shape[0], roi_center[0] + 112)y_min = max(0, roi_center[1] - 112)y_max = min(max_image.shape[1], roi_center[1] + 112)# 创建一个空的224x224大小的数组,并用0填充cropped_image = np.zeros((224, 224))# 计算裁剪区域在目标数组中的位置cropped_x_min = max(0, 112 - (roi_center[0] - x_min))cropped_x_max = cropped_x_min + min(x_max - x_min, 224)cropped_y_min = max(0, 112 - (roi_center[1] - y_min))cropped_y_max = cropped_y_min + min(y_max - y_min, 224)# 将ROI区域复制到裁剪图像中cropped_image[cropped_x_min:cropped_x_max, cropped_y_min:cropped_y_max] = max_image[x_min:x_max, y_min:y_max]return cropped_image
# 读取标签和原始图像
image_label = sitk.ReadImage(label_path)
# 读取原始NII文件
image_origin = sitk.ReadImage(image_path)# 转换为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])])
# 找到最大值的索引
max_index = max_index(label_array)
# 找出标签中勾画ROI最多的那张图像
max_image = origin_array[max_index]
max_label =label_array[max_index]
#找到ROI的中心点
roi_center = find_roi_center(max_label)
# 根据中心点坐标向四周延伸裁剪出224*224
cropped_image = crop_roi(max_image, roi_center)print("裁剪后的图像:\n", cropped_image.shape)
print("ROI 中心点坐标:", roi_center)def three_image(max_index):max_label0 = label_array[max_index-1]max_label1 = label_array[max_index]max_label2 = label_array[max_index+1]max_image0 = origin_array[max_index-1]max_image1 = origin_array[max_index]max_image2 = origin_array[max_index+1]# 找到ROI的中心点#roi_center0 = find_roi_center(max_label0)roi_center1 = find_roi_center(max_label1)#roi_center2 = find_roi_center(max_label2)# 根据中心点坐标向四周延伸裁剪出224*224cropped_image0 = crop_roi(max_image0, roi_center1)cropped_image1 = crop_roi(max_image1, roi_center1)cropped_image2 = crop_roi(max_image2, roi_center1)# 将三个图像数组堆叠成一个新的数组stacked_images = np.stack((cropped_image0, cropped_image1, cropped_image2))return stacked_imagesimages = three_image(max_index)
print("保存了三个层面的图像:", images.shape )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/10511.shtml

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

相关文章

容器镜像安全管理解析

目录 1. 镜像的层次结构与安全性2. 安全扫描工具3. 安全的最佳实践4. 安全策略实施 镜像安全在容器化和云原生应用中至关重要,因为容器镜像通常包含了应用及其依赖的所有必要组件,任何安全漏洞都可能成为攻击的入口点。 1. 镜像的层次结构与安全性 容器…

【DevOps】Linux 网络命令netstat详解

目录 一、netstat 命令的主要功能 常用 netstat 命令及选项 二、示例和用法 1. 查看所有连接和监听端口 2. 显示端口和进程信息 3. 使用 netstat 查看路由表 4. 查看接口统计 5. 查看服务和协议的统计信息 6. 持续监控网络状态 7. 组合使用 netstat 选项 8. 其他有用…

GEE案例——广东省梅州市梅县区松口镇的梅江横山水灾监测(利用sentinel-1和大津法计算洪水时序面积)

背景 2024年4月5日晚,广东省气象部门发布消息称,4月5日0时到20时,广东中北部出现了暴雨到大暴雨,其中从化吕田累计雨量最大达到225.7毫米。累计降水量达到大暴雨的地方还包括惠州龙门县永汉镇205.2毫米、清远佛冈县水头镇188.6毫米、韶关新丰县梅坑镇174.5毫米、河源东源县…

锐捷EWEB网管系统RCE漏洞

文章目录 免责声明漏洞描述漏洞原理影响版本漏洞复现修复建议 免责声明 该文章只为学习和交流,请不要做违法乱纪的事情,如有与本人无关 漏洞描述 锐捷网管系统是由北京锐捷数据时代科技有限公司开发的新一代基于云的网络管理软件,以"…

哈希表(unordered_set、unordered_map)

文章目录 一、unordered_set、unordered_map的介绍二、哈希表的建立方法2.1闭散列2.2开散列(哈希桶/拉链法) 三、闭散列代码(除留余数法)四、开散列代码(拉链法/哈希桶) 一、unordered_set、unordered_map的…

数据结构之——队列详解

目录 前言: 一、什么是队列 二、队列的实现 2.1 队列结构 2.2 队列初始化 2.3 队列销毁 2.4 入队列 2.5 出队列 2.6 获取队列头部元素 2.7 获取队列尾部元素 2.8 获取队列中有效元素个数 2.9 检测队列是否为空 三、 代码总览 Queue.h test.c 四、例题 前言…

树莓派、ubuntu低版本python3安装库

如果遇到树莓派中自带低版本python3,又不想额外去安装python3时,可能会遇到版本过低,无法安装库的情况,以下用我实际情况举例解决方案。 本次遇到的问题是树莓派低版本中,python3为3.7.3,需要安装numpy&am…

Python专题:八、列表(1)

Python的内置数据类型 数据类型:列表 list类型 可以是字符串,浮点数,整数,列表 列表特性 ①集合性的数据类型 ②列表是有序的 ③列表是可更新的 访问列表元素的方式也是[索引],也是从0开始的,不能超过…

EasyNmon服务器性能监控工具环境搭建

一、安装jdk环境 1、看我这篇博客 https://blog.csdn.net/weixin_54542209/article/details/138704468 二、下载最新easyNmon包 1、下载地址 https://github.com/mzky/easyNmon/releases wget https://github.com/mzky/easyNmon/releases/download/v1.9/easyNmon_AMD64.tar.…

GitLab CI/CD的原理及应用详解(一)

本系列文章简介: 在当今快速变化的软件开发环境中,持续集成(Continuous Integration, CI)和持续交付(Continuous Delivery, CD)已经成为提高软件开发效率、确保代码质量以及快速响应市场需求的重要手段。Gi…

Ansible-inventory和playbook

文章目录 一、inventory 主机清单1、列表表示2、inventory 中的变量3、变量3.1 主机变量3.2 组变量3.3 组嵌套 二、playbook剧本1、playbook的组成2、编写剧本2.1 剧本制作2.2 准备nginx.conf2.3 运行剧本2.4 查看webservers服务器2.5 补充参数 3、剧本定义、引用变量3.1 剧本制…

要将D-SUB电缆连接到工装接口和被测件接口

准备工作: • 确认D-SUB电缆的类型(如DB9、DB25等)与工装接口和被测件接口匹配。 • 检查电缆两端的接口是否完好无损,无弯曲针脚或损坏的屏蔽层。 • 确保工作区域整洁,避免灰尘或异物进入接口。 • 识别接口&…

河源知识付费系统报价,教育机构怎么进行网络推广呢?

中国教育培训领域的市场空间巨大。教育支出在中国已经超过其他生活费用成为仅次于食物的第二大日常支出。做好线上的营销推广成为了各大企业主思索的问题。其实对于教育行业的网络营销推广方式有很多种,其中大部分与其他行业的形式相同。教育机构怎么进行网络推广呢…

kdb 调试内核-延迟驱动加载

说明: 系统在启动过程中,一些要调试的驱动在 "进入kdb 之前" 就已经加载了, 那么,我们就需要延迟 "加载驱动" #define XX_module_platform_driver(__platform_driver) \XX_module_driver(__platform_driver, platform_d…

【Java】高效解决 非降序数组合并 两种方法

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! oj:https://leetcode.cn/problems/merge-sorted-array/submissions/ 合并两个有序数组是个经典问题,它不仅在算法学习中频繁出现,也在实际开发中经常遇到。合并数…

计算机毕业设计】springbootBBS论坛系统

本系统为用户而设计制作 BBS论坛系统,旨在实现BBS论坛智能化、现代化管理。本BBS论坛自动化系统的开发和研制的最终目的是将BBS论坛的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利和条件。使BBS论坛系统数字化…

ADS基础介绍篇1

一. ADS简介 常用的射频仿真软件有ADS和AWR,ADS(Advanced Design system)最传统,是Agilent公司于2008年推出的电磁场仿真器,可提供原理图设计和layout版图设计。仿真功能十分强大,可提供从无源到有源,从直流到交流&am…

(十一)JSP教程——page对象

page对象用来处理当前请求的JSP页面的实现类的实例,相当于Java类中的this,这个对象在JSP中应用并不是很多。 page对象提供的主要方法及其说明。 getClass()获得对象运行时的类 hashCode ()获得该对象的哈希码值 …

关于 MongoDB 数据库基本操作的详细介绍

MongoDB 是一个基于分布式文件存储的数据库,其设计旨在提供高性能、可扩展性和易用性。以下是关于 MongoDB 数据库基本操作的详细介绍 一、MongoDB 简介 MongoDB 是一个面向文档的数据库,其数据存储在类似 JSON 的 BSON(Binary JSON&#x…

在Chisel3中,不支持对子字(subword)进行赋值。在 Chisel 中,UInt 类型是一个不可变的位宽数据类型,它表示一个固定位宽的无符号整数。

在Chisel3中,不支持对子字(subword)进行赋值。这种设计决策背后的原因涉及到硬件描述语言中类型和数据抽象的最佳实践。 不支持子字赋值的原因 硬件描述的性质: 在硬件设计中,操作和修改单独的位或子字通常与较高的复…