nii convert to 2D image【python】
可以自己精简,我的label是二分类
import SimpleITK as sitk
import cv2
from PIL import Image
import numpy as np
import nibabel as nib # nii格式一般都会用到这个包
import imageio # 转换成图像
import osimport numpy as np
from scipy.ndimage import rotate
from scipy.ndimage import median_filter
import matplotlib.pyplot as pltxy = 128
vol1 = int(xy/2)
vol2 = int(xy/4)
vol3 = int(vol2+16)def preprocess(image):result = median_filter(image, size=3)"""# 添加高斯噪声noise = np.random.normal(0, 25, size=image.shape)noise_img = image + noise.astype('uint8')# 双边滤波result = cv2.bilateralFilter(noise_img, 9, 75, 75)# 显示图像cv2.imshow('src', image)cv2.imshow('noise', noise_img)cv2.imshow('result', result)cv2.waitKey()cv2.destroyAllWindows()"""return resultdef create_dirs(out_path, num):for i in range(1, num): # 这里需要注意,i取不到6,因为range()是前闭后开的,即i的取值范围为1-5。dir = os.path.join(r'crop/test4/ct/')# 前者为路径,后者为待创建文件夹的名称。注意,批量创建文件夹时不能有重复名称的,因此可以对文件夹加上序号信息。isExists = os.path.exists(dir)if not isExists:os.mkdir(dir)def mask2d(input_path, output_folder, idx):# 加载NIfTI文件img = nib.load(input_path)data = img.get_fdata()# 获取数据的形状信息num_slices = data.shape[2] # 切片数量print(data.shape, num_slices)# 遍历每个切片并保存为PNG图像for i in range(num_slices):slice_data = data[:, :, i] # 提取当前切片数据# Image.fromarray(255*img_array_list[foo].astype('int')).convert('L')image = Image.fromarray(255 * slice_data.astype('int')).convert('L')image = image.rotate(270)# image = Image.fromarray(slice_data) # 创建PIL图像对象output_name = f"{output_folder}slice_{idx}_{i}.png" # 设置输出文件名image.save(output_name) # 保存为PNG图像def nii2d(img_addr, target_folder, idx):img_addr_n = nib.load(img_addr)# Convert them to numpy format,data = img_addr_n.get_fdata()# clip the images within [-125, 275],data_clipped = np.clip(data, -125, 275)# normalize each 3D image to [0, 1], anddata_normalised = (data_clipped - (-125)) / (275 - (-125))split_root = img_addr.split('\\') # 通过\\来进行截断print(split_root) # ['crop/test4/ct/volume-0.nii']# extract 2D slices from 3D volume for training cases while# e.g. slice 000for i in range(data.shape[2]):formattedi = "{:03d}".format(i)slice000 = data_normalised[:, :, i] * 255image = Image.fromarray(slice000)image = image.convert("L")image = image.rotate(270)image = image.transpose(Image.Transpose.FLIP_LEFT_RIGHT)image.save(target_folder +str(idx)+"-"+str(i)+ ".png")for i in range(20):k = i + 1image_path = "ct/volume-{}.nii".format(str(i))label_path = "label/segmentation-{}.nii.gz".format(str(i))label = sitk.ReadImage(label_path, sitk.sitkInt16)label_array = sitk.GetArrayFromImage(label)image = sitk.ReadImage(image_path, sitk.sitkInt32)image_array = sitk.GetArrayFromImage(image) # 分别读图像和标签数据print("\nimage_array=",image_array.shape, " label_array=",label_array.shape)center_x = (image_array.shape[1]) // 2center_y = (image_array.shape[2]) // 2center_z = (image_array.shape[0]) / 2 # 分别计算出xyz方向上的中心print("center_x=", center_x, "center_y=", center_y, "center_z=",center_z)center_x = center_x - vol2image_array = image_array[:, center_x - vol3:center_x + vol3, center_y - xy:center_y + xy]label_array = label_array[:, center_x - vol3:center_x + vol3, center_y - xy:center_y + xy] # 在XY裁剪出一个256 * 256的区域#####只需要保存有标签的序列就行了z = np.any(label_array, axis=(1, 2))start_slice, end_slice = np.where(z)[0][[0, -1]]# 截取保留区域image_array = image_array[start_slice:end_slice + 1, :, :]label_array = label_array[start_slice:end_slice + 1, :, :]# print("Preprocessed shape:",ct_array.shape,seg_array.shape)new_image = sitk.GetImageFromArray(image_array)new_image.SetDirection(image.GetDirection())new_image.SetOrigin(image.GetOrigin())new_image.SetSpacing(image.GetSpacing())new_seg = sitk.GetImageFromArray(label_array)new_seg.SetDirection(label.GetDirection())new_seg.SetOrigin(label.GetOrigin())new_seg.SetSpacing(label.GetSpacing())sitk.WriteImage(new_image, "crop/test4/ct/volume-{}.nii".format(str(i)))sitk.WriteImage(new_seg, "crop/test4/label/segmentation-{}.nii.gz".format(str(i)))nii2d("crop/test4/ct/volume-" + str(i) + ".nii", "crop/png_ct/", i)mask2d("crop/test4/label/segmentation-" + str(i) + ".nii.gz", "crop/png_label/", i)"""对于label来说是ok的,但是对于那个来说不行"""相关文章:
nii convert to 2D image【python】
可以自己精简,我的label是二分类 import SimpleITK as sitk import cv2 from PIL import Image import numpy as np import nibabel as nib # nii格式一般都会用到这个包 import imageio # 转换成图像 import osimport numpy as np from scipy.ndimage import ro…...
C语言指针学习 之 指针是什么
前言 指针是C语言中一个重要概念,也是C语言的一个重要特色,正确而灵活地运用指针可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人都应当深入的学习和掌握指针,也可以说不掌握指针就没有掌握C语言的精华。 一、什么是指针 想弄清楚什…...
【文本到上下文 #10】探索地平线:GPT 和 NLP 中大型语言模型的未来
一、说明 欢迎阅读我们【文本到上下文 #10】:此为最后一章。以我们之前对 BERT 和迁移学习的讨论为基础,将重点转移到更广阔的视角,包括语言模型的演变和未来,特别是生成式预训练转换器 (GPT) 及其在 NLP 中…...
(四)elasticsearch 源码之索引流程分析
https://www.cnblogs.com/darcy-yuan/p/17024341.html 1.概览 前面我们讨论了es是如何启动,本文研究下es是如何索引文档的。 下面是启动流程图,我们按照流程图的顺序依次描述。 其中主要类的关系如下: 2. 索引流程 (primary) 我们用postman发送请求&…...
飞天使-k8s知识点16-kubernetes实操1-pod
文章目录 深入Pod 创建Pod:配置文件详解写个pod的yaml 文件深入Pod 探针:探针技术详解 深入Pod 创建Pod:配置文件详解 资源清单参考链接:https://juejin.cn/post/6844904078909128712写个pod的yaml 文件 apiVersion: v1 kind: P…...
【gcc】webrtc发送侧 基于丢包更新码率
参考大神的分析1 rtt 有问题:网络拥堵,直接下调码率 G:\CDN\rtcCli\m98\src\modules\congestion_controller\goog_cc\send_side_bandwidth_estimation.hRttBasedBackoff RttBasedBackoff rtt_backoff_;class RttBasedBackoff {public:explicit RttBasedBackoff(const WebRtcK…...
数字经济的未来:探索Web3的商业模式
随着技术的不断演进,Web3正逐渐成为数字经济发展的关键驱动力之一。在这个数字时代,我们目睹着Web3为商业模式带来翻天覆地的变革,探索着数字经济未来的可能性。 1. 去中心化的商业生态 Web3以去中心化为核心理念,打破了传统商业…...
Centos7部署MetaBase-v0.48.3
MetaBase_v0.48.3下载地址 : http://downloads.metabase.com/v0.48.3/metabase.jar JDK11 下载地址:https://repo.huaweicloud.com/java/jdk/11.0.113/jdk-11.0.1_linux-x64_bin.tar.gz 1.不修改源数据库的方式 官方提示此方式仅用于测试学习使用,如用生…...
【计算机网络】Socket的SO_TIMEOUT与连接超时时间
SO_TIMEOUT选项是Socket的一个选项,用于设置读取数据的超时时间。它指定了在读取数据时等待的最长时间,如果在指定的时间内没有数据可读取,将抛出SocketTimeoutException异常。 SO_TIMEOUT的设置 默认情况下,SO_TIMEOUT选项的值…...
解密 ARMS 持续剖析:如何用一个全新视角洞察应用的性能瓶颈?
作者:饶子昊、杨龙 应用复杂度提升,根因定位困难重重 随着软件技术发展迭代,很多企业软件系统也逐步从单体应用向云原生微服务架构演进,一方面让应用实现高并发、易扩展、开发敏捷度高等效果,但另外一方面也让软件应…...
【OJ比赛日历】春节快乐 #02.10-02.16 #9场
CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2024-02-10(周六) #4场比赛2024-02-11…...
前端下载文件有哪些方式
前端下载文件有哪些方式 在前端,最常见和最常用的文件下载方式是: 使用 标签的 download 属性: 创建一个 标签,并设置其 href 属性为文件的 URL,然后使用 download 属性指定下载的文件名。 这种方式简单直接&…...
vscode预览github上的markdown效果
需要安装的插件有: Github Markdown Preview Markdown Checkboxes Markdown Emoji Markdown footnotes Markdown Preview Github Styling Markdown Preview Mermaid Support Markdown yaml Preamble ctrlshiftv结合双页功能...
使用PaddleNLP识别垃圾邮件:用BERT做中文邮件内容分类,验证集准确率高达99.6%以上(附公开数据集)
使用PaddleNLP识别垃圾邮件:用BERT做中文邮件内容分类,验证集准确率高达99.6%以上(附公开数据集)。 要使用PaddleNLP和BERT来识别垃圾邮件并做中文邮件内容分类,可以按照以下步骤进行操作: 安装PaddlePaddle和PaddleNLP:首先,确保在你的环境中已经安装了PaddlePaddle和…...
在bash或脚本中,如何并行执行命令或任务(命令行、parallel、make)
最近要批量解压归档文件和压缩包,所以就想能不能并行执行这些工作。因为tar自身不支持并行解压,但是像make却可以支持生成一些文件,所以我才有了这种想法。 方法有两种,第一种不用安装任何软件或工具,直接bash或其他 …...
拼音笔记笔记
一、翀的读音:chōng 声母:ch 韵母:ong 声调:一声 二、汉字释义: 向上直飞,相当于“冲”。 三、汉字结构:左右结构 四、部首:羽 五、相关词组: 翀举:谓成仙升…...
13. Threejs案例-绘制3D文字
13. Threejs案例-绘制3D文字 实现效果 知识点 FontLoader 一个用于加载 JSON 格式的字体的类。 返回 font,返回值是表示字体的 Shape 类型的数组。 其内部使用 FileLoader 来加载文件。 构造器 FontLoader( manager : LoadingManager ) 参数类型描述managerLo…...
clickhouse清理日志。
参考Clickhouse:日志表占用大量磁盘空间怎么办?_clickhouse store目录很大-CSDN博客t 清理脚本如下,清理动作需要时间比较长,10多分钟: alter table system.trace_log delete where event_date < 2024-01-01 alt…...
JS中实现继承
1.使用call实现继承(不推荐) function Animal(name) {this.name name;this.run function() {console.log(this.name, "跑");} } function Dog(name) {// 继承Animal.call(this, name);this.sleep function() {console.log(this.name, &quo…...
spring boot学习第九篇:操作mongo的集合和集合中的数据
1、安装好了Mongodb 参考:ubuntu安装mongod、配置用户访问、添删改查-CSDN博客 2、pom.xml文件内容如下: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
