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…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
