【医学影像】LIDC-IDRI数据集的无痛制作

LIDC-IDRI数据集制作

    • 0.下载
      • 0.0 链接汇总
      • 0.1 步骤
    • 1.合成CT图
    • reference

0.下载

0.0 链接汇总

  • LIDC-IDRI官方网址:https://www.cancerimagingarchive.net/nbia-search/?CollectionCriteria=LIDC-IDRI
  • NBIA Data Retriever 下载链接:https://wiki.cancerimagingarchive.net/display/NBIA/Downloading+TCIA+Images

0.1 步骤

  1. 检索
    分成两种,Simple Search一个是多种关键字筛选,鉴定为没用。
    在这里插入图片描述
    直接用Text Search ,将annotation的ID输上,点击search
    在这里插入图片描述
  2. 加入Cart
    检索出来会有好几种模态/任务的数据,选择自己需要点击购物车加入Cart。
    例如:我是做CT分割,故只选择模态为CT的那个数据。
    在这里插入图片描述
    重复Text检索步骤,得到最终自己需要的所有Cart:
    在这里插入图片描述
  3. 下载
  • 安装好NBIA Data Retriever
    前面链接下载,或者Download->Get NBIA Data Retriever 下载,有官方指引。
    在这里插入图片描述

  • 生成manifest文件
    在这里插入图片描述

  • 下载

设置好路径,点击start
在这里插入图片描述

1.合成CT图

这边是直接偷了NaviAirwayi的代码进行dicom文件merge成nii文件。
文件结构需要为:
在这里插入图片描述

如果按照之前步骤进行下载的话,获得的文件就是上述结构。只是子文件名称会因为太长而被修改,不过不影响结果,最终生成文件名是按照一级目录命名。
在这里插入图片描述

预处理代码完整如下:

import numpy as np
import os
import SimpleITK as sitk
from PIL import Image
import pydicom
import cv2
import nibabel as nib
import pydicom## funtion
#####-----------------------------------------------------------------------def loadFile(filename):ds = sitk.ReadImage(filename)#pydicom.dcmread(filename)img_array = sitk.GetArrayFromImage(ds)frame_num, width, height = img_array.shape#print("frame_num, width, height: "+str((frame_num, width, height)))return img_array, frame_num, width, height'''
def loadFileInformation(filename):information = {}ds = pydicom.read_file(filename)information['PatientID'] = ds.PatientIDinformation['PatientName'] = ds.PatientNameinformation['PatientSex'] = ds.PatientSexinformation['StudyID'] = ds.StudyIDinformation['StudyDate'] = ds.StudyDateinformation['StudyTime'] = ds.StudyTimeinformation['Manufacturer'] = ds.Manufacturerreturn information
'''def get_3d_img_for_one_case(img_path_list, img_format="dcm"):img_3d=[]for idx, img_path in enumerate(img_path_list):print("progress: "+str(idx/len(img_path_list))+"; "+str(img_path), end="\r")img_slice, frame_num, _, _ = loadFile(img_path)assert frame_num==1img_3d.append(img_slice)img_3d=np.array(img_3d)return img_3d.reshape(img_3d.shape[0], img_3d.shape[2], img_3d.shape[3])
#####-----------------------------------------------------------------------# the path to LIDC-IDRI raw imagesLIDC_IDRI_raw_path = "G:\BAS_test_raw\manifest-1708937949454\LIDC-IDRI"LIDC_IDRI_raw_img_dict = {}
img_names = os.listdir(LIDC_IDRI_raw_path)
img_names.sort()
img_namespath_to_a_case = ""def find_imgs(input_path):global path_to_a_caseitems = os.listdir(input_path)items.sort()# print("There are "+str(items)+" in "+str(input_path))All_file_flag = Truefor item in items:if os.path.isdir(input_path + "/" + item):All_file_flag = Falsebreakif All_file_flag and len(items) > 10:# print("we get "+str(input_path))path_to_a_case = input_pathelse:for item in items:if os.path.isdir(input_path + "/" + item):# print("open filefloder: "+str(input_path+"/"+item))find_imgs(input_path + "/" + item)for idx, img_name in enumerate(img_names):print(idx / len(img_names), end="\r")find_imgs(LIDC_IDRI_raw_path + "/" + img_name)slice_names = os.listdir(path_to_a_case)slice_names.sort()LIDC_IDRI_raw_img_dict[img_name] = []for slice_name in slice_names:if slice_name.split(".")[1] == "dcm":LIDC_IDRI_raw_img_dict[img_name].append(path_to_a_case + "/" + slice_name)print("Show the case names: "+str(LIDC_IDRI_raw_img_dict.keys()))# set output pathoutput_image_path = r"G:\myBAS\test\images"
if not os.path.exists(output_image_path):os.mkdir(output_image_path)for case in LIDC_IDRI_raw_img_dict.keys():img_3d = get_3d_img_for_one_case(LIDC_IDRI_raw_img_dict[case])sitk.WriteImage(sitk.GetImageFromArray(img_3d),output_image_path + "/" + case + ".nii.gz")

今天折腾了半死,希望对大家有帮助。

reference

refer1

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

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

相关文章

【王道数据结构】【chapter7查找】【P308t5】

试编写一个算法&#xff0c;判断给定的二叉树是否是二叉排序树 #include <iostream> #include <queue> typedef struct node{int data;struct node* left;struct node* right; }node,*pnode;pnode buynode(int x) {pnode tmp(pnode) malloc(sizeof (node));tmp->…

SpringMVC 学习(九)之拦截器

目录 1 拦截器介绍 2 创建一个拦截器类 3 配置拦截器 1 拦截器介绍 在 SpringMVC 中&#xff0c;拦截器 (Interceptor) 是一种用于拦截 HTTP 请求并在请求处理之前或之后执行自定义逻辑的组件。拦截器可以用于实现以下功能&#xff1a; 权限验证&#xff1a;在请求处理之前…

SORA 到底是什么?如何用bitget wallet购买?

什么是SORA&#xff1f; SORA 是一种模因币&#xff0c;灵感来自 OpenAI 最新的人工智能模型 Sora&#xff0c;它巧妙地根据文本输入生成视频。 SORA 诞生于加密社区内人工智能项目的热潮中&#xff0c;利用 OpenAI 的公告推出了一种独特且时尚的数字资产。正如 memecoin 网站…

文件操作(IO技术,重要!!!)

1、文本文件和二进制文件 按文件中数据组织形式&#xff0c;我们把文件分为文本文件和二进制文件两大类&#xff0c; 1. 文本文件 文本文件存储的是普通“字符”文本&#xff0c;默认为unicode字符集&#xff08;两个字节表示一个字符&#xff0c;65535&#xff09;&#xff0c…

python|闲谈2048小游戏和数组的旋转及翻转和转置

目录 2048 生成数组 n阶方阵 方阵旋转 顺时针旋转 逆时针旋转 mxn矩阵 矩阵旋转 测试代码 测试结果 翻转和转置 2048 《2048》是一款比较流行​的数字游戏​&#xff0c;最早于2014年3月20日发行。原版2048由Gabriele Cirulli首先在GitHub上发布&#xff0c;后被移…

【MQ05】异常消息处理

异常消息处理 上节课我们已经学习到了消息的持久化和确认相关的内容。但是&#xff0c;光有这些还不行&#xff0c;如果我们的消费者出现问题了&#xff0c;无法确认&#xff0c;或者直接报错产生异常了&#xff0c;这些消息要怎么处理呢&#xff1f;直接丢弃&#xff1f;这就是…

浅谈 Linux 网络编程 - 网络字节序

文章目录 前言核心知识关于 小端法关于 大端法网络字节序的转换 函数 前言 在进行 socket 网络编程时&#xff0c;会用到字节流的转换函数、例如 inet_pton、htons 等&#xff0c;那么为什么要用到这些函数呢&#xff0c;本篇主要就是对这部分进行介绍。 核心知识 重点需要记…

韩国突发:将批准比特币ETF

作者&#xff1a;秦晋 韩国两党宣布将批准比特币ETF。比特币也再次成为竞选的宠儿。 4月10日&#xff0c;韩国将迎来每隔4年而进行的一次立法大选。在大选之前&#xff0c;现执政党与反对党都承诺将批准比特币ETF。 我们知道&#xff0c;比特币的主要受众群体以年轻人居多。此前…

idea打包报错,clean、package报错

一、idea在打包时&#xff0c;点击clean或package报错如下&#xff1a; Error running ie [clean]: No valid Maven installation found. Either set the home directory in the configuration dialog or set the M2_HOME environment variable on your system. 示例图&#xf…

揭示预处理中的秘密!(二)

目录 ​编辑 1. #运算符 2. ##运算符 3. 命名约定 4. #undef 5. 命令行定义 6. 条件编译 7. 头文件的被包含的方式 8.嵌套文件包含 9. 其他预处理指令 10. 完结散花 悟已往之不谏&#xff0c;知来者犹可追 …

androidapp开发语言,已获千赞

初级 初级研发工程师的定义是掌握基础的Android知识&#xff0c;能够独立完成一个功能&#xff0c;工作年限大概在1-2年&#xff0c;这个层级大部分人通过看一些资料书籍再经过项目练习很快可以达到。这个级别的人往往需要掌握如下一些技能&#xff1a; 掌握Android 四大组件…

Nginx网络服务六-----IP透传、调度算法和负载均衡

1.实现反向代理客户端 IP 透传 就是在日志里面加上一个变量 Module ngx_http_proxy_module [rootcentos8 ~]# cat /apps/nginx/conf/conf.d/pc.conf server { listen 80; server_name www.kgc.org; location / { index index.html index.php; root /data/nginx/html/p…

等保2.0高风险项全解析:判定标准与应对方法

引言 所谓高风险项&#xff0c;就是等保测评时可以一票否决的整改项&#xff0c;如果不改&#xff0c;无论你多少分都会被定为不合格。全文共58页&#xff0c;写得比较细了&#xff0c;但是想到大家基本不会有耐心去仔细看的&#xff08;凭直觉&#xff09;。这几天挑里边相对…

【大数据】Flink 内存管理(一):设置 Flink 进程内存

《Flink 内存管理》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 4 篇文章&#xff1a; Flink 内存管理&#xff08;一&#xff09;&#xff1a;设置 Flink 进程内存Flink 内存管理&#xff08;二&#xff09;&#xff1a;JobManager 内存分配&#xff08;含实际…

智慧校园|智慧校园管理小程序|基于微信小程序的智慧校园管理系统设计与实现(源码+数据库+文档)

智慧校园管理小程序目录 目录 基于微信小程序的智慧校园管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;学生信息管理 &#xff08;2&#xff09; 作业信息管理 &#xff08;3&#xff09;公告…

shader学习记录——融合、融球效果

融合、融球效果shader&#xff0c;重点在等势面公式上 Shader "Custom/MetaballsShader" {Properties{_MainTex ("Texture", 2D) "white" {}_Color("Color",Color) (1,1,1,1)}SubShader{Tags { "RenderType""Opaque…

什么是去中心化云计算?

去中心化云计算是一种新型的云计算方式&#xff0c;它与传统的中心化云计算不同&#xff0c;将数据和计算任务分布到多个节点上&#xff0c;而不是将数据集中存储在中心服务器上。这种云计算方式具有许多优势&#xff0c;包括提高数据安全性、降低运营成本、增强可扩展性和灵活…

【C语言】学生宿舍信息管理系统

目录 项目说明 1. 数据结构设计 2. 功能实现 3. 主菜单设计 4. 文件操作 5. 系统使用 项目展示 1.主菜单功能界面 ​编辑 2.添加信息 3.查询信息 4.修改信息 5.删除信息 6.退出程序 项目完整代码 结语 在这篇博客中&#xff0c;我们将探讨如何使用C语言来开发…

Java 反射机制

​ 更多内容&#xff0c;前往IT-BLOG ​ 反射Reflection被视为动态语言的关键&#xff0c;反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息&#xff0c;并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构…

通过QScrollArea寻找最后一个弹簧并且设置弹簧大小

项目原因&#xff0c;最近需要通过QScrollArea寻找其中最后一个弹簧并且设置大小和策略&#xff0c;因为无法直接调用UI指针&#xff0c;所以只能用代码寻找。 直接上代码&#xff1a; if (m_scrollArea){int iScrollWidth m_labelSelectedTitle->width();m_scrollArea-&g…