医学图像处理——DeepDrr工具CT生成DRR

news2025/1/16 1:58:12

医学图像处理——DeepDrr工具CT生成DRR

  • 一、DeepDrr工具介绍
  • 二、DeepDRR工具使用
  • 三、测试DeepDRR工具
    • 3.1 测试数据集
      • 3.1.1 阿里云数据
      • 3.1.2 LIDC-IDRI肺结节dicom数据集
      • 3.1.3 LIDC-IDRI肺结节dicom数据集
    • 3.2 测试代码
  • 四、总结

一、DeepDrr工具介绍

它可以将CT数据模拟X射线投影生成DRR数据。
DeepDRR将3D和2D的材料分解和散射估计的机器学习模型分别与投影、衰减和噪声注入的分析模型相结合,以实现所需的性能,其实现的流程图如下:
在这里插入图片描述1. DeepDRR工具Github链接
2. DeepDRR工具文档说明

二、DeepDRR工具使用

由于实验室的1080ti不支持cuda11,为了节约调试时间就租用了RTX 2080 Ti * 1卡,租用平台AutoDL,按照1. DeepDRR工具Github链接配置环境就行,在这个平台直接跑README.md文件内容。

# 注意把该命令
conda env create -f environment.yaml
# 换成
conda env create -f environment.yml
# 下面是文档生成命令不用管
sphinx-apidoc -f -o docs/source deepdrr

后续就是提示缺啥包就按啥包。

三、测试DeepDRR工具

3.1 测试数据集

它提供了一个最简单的使用例子,从NifTi.nii.gz(nii文件是volume file格式,常见的一种医学图像,可以由MRI软件生成,它可以看成2维,也可以看成三维)文件中加载一个CT数据,并模拟一个X射线投射生成一张DRR。但是我们没有上述CT数据。

3.1.1 阿里云数据

1. 阿里云数据,找了几个数据集,都是PNG格式的,后续使用.png转.nii.gz,其效果不好。

// 多幅png图片转.nii.gz文件
import numpy as np
import nibabel as nib
from glob import glob
from torch.utils.data import Dataset
from torchvision import transforms
from PIL import Image

class DataSet(Dataset):  # 方便读数据
    def __init__(self, label_path):
        self.label_path = label_path
        self.transform = transforms.Compose([transforms.ToTensor()],)

    def __len__(self):
        return len(self.label_path)

    def __getitem__(self, idx):
        label = self.label_path[idx]
        label = Image.open(label)
        label = self.transform(label)
        return label


label_path = r'C:\Users\tanhui\Downloads\CP\679\3041\*'
label_path = glob(label_path)
dataset = DataSet(label_path)
label = dataset[0]
z, x, y = label.shape
z = len(dataset)  # 通道数
allImage = np.zeros([x, y, z], dtype='uint8')
# print(x, y, z)
for i in range(z):
    label = dataset[i]
    singleImage = label.numpy()
    allImage[:, :, i] = singleImage
# print(allImage.shape)
new_image = nib.Nifti1Image(allImage, np.eye(4))
nib.save(new_image, 'data2.nii.gz')

3.1.2 LIDC-IDRI肺结节dicom数据集

2. LIDC-IDRI肺结节dicom数据集,这个数据集可能要科学上网才下得快且要安装它站里面的一个下载工具(数据集太大,工具帮助我们选择性下载),附上一个简单的下载教程。

// 多张dicm格式文件转.nii.gz文件
#coding=utf-8
import SimpleITK as sitk

def dcm2nii(dcms_path, nii_path):
	# 1.构建dicom序列文件阅读器,并执行(即将dicom序列文件“打包整合”)
    reader = sitk.ImageSeriesReader()
    dicom_names = reader.GetGDCMSeriesFileNames(dcms_path)
    reader.SetFileNames(dicom_names)
    image2 = reader.Execute()
	# 2.将整合后的数据转为array,并获取dicom文件基本信息
    image_array = sitk.GetArrayFromImage(image2)  # z, y, x
    origin = image2.GetOrigin()  # x, y, z
    spacing = image2.GetSpacing()  # x, y, z
    direction = image2.GetDirection()  # x, y, z
	# 3.将array转为img,并保存为.nii.gz
    image3 = sitk.GetImageFromArray(image_array)
    image3.SetSpacing(spacing)
    image3.SetDirection(direction)
    image3.SetOrigin(origin)
    sitk.WriteImage(image3, nii_path)

if __name__ == '__main__':
    dcms_path = r'D:\data\manifest-1668773888310\LIDC-IDRI\LIDC-IDRI-0002\01-01-2000-NA-NA-98329\3000522.000000-NA-04919'  # dicom序列文件所在路径
    nii_path = r'.\test.nii.gz'  # 所需.nii.gz文件保存路径
    dcm2nii(dcms_path, nii_path)

附上dicm格式文件转.nii.gz文件详细教程

3.1.3 LIDC-IDRI肺结节dicom数据集

使用MRIcroGL软件查看合成的CT数据。
在这里插入图片描述

3.2 测试代码

使用下面测试代码,将上面合成的test.nii.gz CT数据生产一张DR。

from deepdrr import geo, Volume, MobileCArm
from deepdrr.projector import Projector # separate import for CUDA init

carm = MobileCArm()
ct = Volume.from_nifti('/path/to/ct_image.nii.gz')

# Initialize the Projector object (allocates GPU memory)
with Projector(ct, carm=carm) as projector:
    # Orient and position the patient model in world space.
    ct.orient_patient(head_first=True, supine=True)
    ct.place_center(carm.isocenter_in_world)
    
    # Move the C-arm to the desired pose.
    carm.move_to(alpha=30, beta=10, degrees=True)
    
    # Run projection
    image = projector()

效果如下:
在这里插入图片描述

四、总结

简单的将DeepDRR工具运行了一下,初测了它的很小一部分功能,后续期待能基于该工具做出更好的应用。

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

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

相关文章

[附源码]SSM计算机毕业设计政府公用车辆管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

VUE全家桶 (Vue-cli、Vue-route、Vuex)学习笔记

Es6 let 是变量2.const 1. 是常量不能修改 创建的时候一定要赋值 要不报错定义的类 里面的属性值可以修改3.对象创建 1.可以先定义const name1; Const a{name}; 输出a的话就是{“name”:1}; 可以直接放进去函数 Const a{ Run(){ }, Set(){ } } 4. 遍历 遍…

【附源码】计算机毕业设计JAVA校园餐厅管理

项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven Vue 等等组成,B/…

haproxy软件的日志输出到指定文件

默认haproxy的日志是输出到系统syslog中,查看起来不是非常方便,为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来。需要将haproxy的info及notice日志分别记录到不同的日志文件中。 需要修改rsyslog配置,为了便于管…

java包以及权限修饰符

Java包和权限修饰符Java包什么是包?如何导包?IDEA如何自动化导包?Java权限修饰符什么是权限修饰符?权限修饰符的分类和具体作用范围:Java包 什么是包? 1.包是用来分门别类的管理各种不同类的,…

Vue【实战三件套】如何封装网络请求、如何解决跨域问题,如何使用mock模拟后端数据,快来一起来看看吧~

一、如何封装网络请求 1.新建项目 vue create item_12.src下新建文件config.js 什么是开发环境 在一个产品的前端开发过程中,一般来说会经历本地开发、测试脚本、开发自测、测试环境、预上线环境,然后才能正式的发布。对应每一个环境可能都会有所差异&…

IPD-全面认识IPD流程

一、商业实现角度透视IPD流程 基于IPD的商业实现过程包括商业机会—商业计划—商业开发—商业兑现。这个过程适用于所有行业,适用于所有创新型市场化企业,包括贸易型企业、外包解决方案型企业、投资型企业等。 商业机会包括市场管理过程中的市场洞察和机会分析,以及需…

[MQ] MQ的应用场景及Docker安装RabbitMQ

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

PGL图学习之图神经网络GraphSAGE、GIN图采样算法[系列七]

0. PGL图学习之图神经网络GraphSAGE、GIN图采样算法[系列七] 本项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5061984?contributionType1 相关项目参考:更多资料见主页 关于图计算&图学习的基础知识概览:前置知识点学…

CEAC之《计算机应用助理工程师》3

👨‍💻个人主页:微微的猪食小窝 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 微微的猪食小窝 原创 收录于专栏 【CEAC证书】 1在子数据表中最多可以嵌套多少级子数据表? A、5级 B、6级 C、7级 D、8级D2在窗…

leetcode-每日一题-1732-找到最高海拔(简单,数学思想)

今天的每日一题很简单就是一个数学思考没啥难度 有一个自行车手打算进行一场公路骑行,这条路线总共由 n 1 个不同海拔的点组成。自行车手从海拔为 0 的点 0 开始骑行。 给你一个长度为 n 的整数数组 gain ,其中 gain[i] 是点 i 和点 i 1 的 净海拔高度…

mmdetection训练得到的权重/checkpoints文件分析

这篇文章对mmdetection训练得到的模型权重,或者说checkpoints文件进行分析,一般模型保存在work-dir文件夹下,具体路径要参考训练用到的config,即配置文件。保存的模型一般是.pt的文件。 .pt模型文件读取方法 这种模型文件可以用…

详解Unity中的Nav Mesh新特性|导航寻路系统 (三)

前言 通过前面两篇的介绍与讲解我们已经对新版NavMesh有了一个基础的了解和使用,本篇我们继续讲解剩余的两个组件NavMeshModifier、NavMeshModifierVolume,这两个组件是主要是用于影响导航网格的生成的。所以内容不是很主要,但也非常重要。 …

dubbo:从零理解及搭建dubbo微服务框架(一)

0.引言 dubbo作为阿里巴巴开源的微服务框架,提供了高性能的RPC调用。同时因为有阿里的背书,在国内市场得到了广泛应用,dubbo的开源工作在2018年2月阿里将项目捐献给apache基金会后,得到了更加广大的发展。 之前我们讲解了spring…

[相向双指针] 167. 两数之和 II - 输入有序数组,15. 三数之和,11. 盛最多水的容器,42. 接雨水

相向双指针 该文结合灵神讲解进行编码:https://www.bilibili.com/video/BV1bP411c7oJ 相向双指针一般用于有序的数组,两个指针分别从头和尾向中间遍历,直到找到满足条件的 ans。 167. 两数之和 II - 输入有序数组 https://leetcode.cn/pr…

声明式查询服务,只需定义,无需实现

1. 概览 在日常开发中,数据查询是最为常见的需求,也是占比最大的一部分。为了降低成本提升开发效率,已经封装了两个组件: 将 QueryObject 与 Spring Data Jpa 进行集成,无需编写实现代码,只需通过注解定义…

大厂永恒敲门砖——Android 系统启动流程详解

正文 AMS 是 Android 中最核心的服务之一,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,它本身也是一个 Binder 的实现类,应用进程能通过 Binder 机制调…

【Java开发】 Spring 04:云服务器 Docker 环境下安装 Redis 并连接 Spring 项目实现简单 CRUD

Redis是目前使用最多的缓存,包括Spring Boot 中我们也是会用Redis做很多事情。它是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库,具备数据持久化、多数据结构存储及数据备份等特点。Redis 和 Mongo 同属于文档型数据…

C++17新特性的使用场景总结

一、简单特性 1. namespace 嵌套 C17使我们可以更加简洁使用命名空间&#xff1a; 2. std::variant 升级版的C语言Union 在C17之前&#xff0c;通常使用Union来定义一个可以存储不同类型的变量&#xff0c;现在可以通过std::variant<T1,T2,...> 来定义一个可以存储不同…

Day2.

文章目录一、回文日期1、题目描述2、输入描述3、输出描述4、参考代码二、杨辉三角形1、题目描述2、输入描述3、输出描述4、参考代码一、回文日期 1、题目描述 2020 年春节期间&#xff0c;有一个特殊的日期引起了大家的注意&#xff1a;2020 年 2 月 2 日。因为如果将这个日期…