从零开始的二三维CAD|CAE软件: 解决VTK,DICOM体素化-失效问题.

article/2025/6/8 22:06:25

背景: 

在从零开始的二三维软件开发中, 需要加载CT的dicoms影像文件, 并将其序列化之后的数据,体素化

可惜..vtk的c#库,将其体素化的时候,竟然失败... 

使用vtkDicomReader ,设置 Dicom文件夹读取,竟然不停的失败...从网上找了一些版本.也没啥可用的资料...

解决办法:

直接使用 fo-Dicoms库,读取每一张 Dicom影像后, 按照序列排序后, 然后一张张数据读取,接着将数据赋予VtkImageData后,创建vtkVolumActor.

关键代码分享:

 // 根据DICOM数据类型分配适当的VTK数据类型var pixelData = DicomPixelData.Create(firstDataset);int bitsAllocated = pixelData.BitsAllocated;bool isSigned = pixelData.PixelRepresentation == PixelRepresentation.Signed;if (bitsAllocated == 16){imageData.AllocateScalars(isSigned ? 4 : 8, 1);//8}else if (bitsAllocated == 8){imageData.AllocateScalars(4, 1);//4}else{throw new NotSupportedException($"不支持的位深度: {bitsAllocated}");}// 获取数据范围以便正确映射int[] extent = imageData.GetExtent();// 遍历所有切片for (int z = 0; z < depth; z++){var dataset = dicomSeries[z].Dataset;var currentPixelData = DicomPixelData.Create(dataset);var frameData = currentPixelData.GetFrame(0);byte[] byteData = frameData.Data;// 根据数据类型处理像素数据if (bitsAllocated == 16){// 正确将byte[]转换为short[]short[] pixels = new short[byteData.Length / 2];Buffer.BlockCopy(byteData, 0, pixels, 0, byteData.Length);// 如果需要考虑字节顺序if (BitConverter.IsLittleEndian != dataset.TryGetSingleValue(DicomTag.HighBit, out ushort highBit) || highBit == 0){for (int i = 0; i < pixels.Length; i++){pixels[i] = IPAddress.NetworkToHostOrder(pixels[i]);}}// 遍历当前切片的所有像素for (int y = 0; y < height; y++){for (int x = 0; x < width; x++){int index = y * width + x;short pixelValue = pixels[index];imageData.SetScalarComponentFromDouble(x, height - 1 - y, z, 0, pixelValue);}}}else if (bitsAllocated == 8){// 直接使用byte数据for (int y = 0; y < height; y++){for (int x = 0; x < width; x++){int index = y * width + x;byte pixelValue = byteData[index];imageData.SetScalarComponentFromDouble(x, height - 1 - y, z, 0, pixelValue);}}}}

 效果展示:


http://www.hkcw.cn/article/iTCwCmcbHq.shtml

相关文章

Cesium快速入门到精通系列教程一

一、打造第一个Cesium应用 1、官方渠道下载Cesium&#xff08;可选择历史版本&#xff09; ​​GitHub Releases页面​​ 访问 Cesium GitHub Releases&#xff0c;此处列出了所有正式发布的版本。 通过标签&#xff08;如 v1.95.0&#xff09;选择目标版本&#xff0c;下载…

【多线程初阶】synchronized -监视器锁monitor lock

文章目录 &#x1f305;synchronized关键字&#x1f30a; synchronized 的互斥&#x1f30a; synchronized 的变种写法&#x1f3c4;‍♂️synchronized 修饰代码块 :明确指定锁哪个对象&#x1f3c4;‍♂️synchronized 修饰方法 &#x1f30a; synchronized 的可重入性&#…

C# 面向对象特性

面向对象编程的三大基本特性是&#xff1a;封装、继承和多态。下面将详细介绍这三大特性在C#中的体现方式。 封装 定义&#xff1a;把对象的数据和操作代码组合在同一个结构中&#xff0c;这就是对象的封装性。 体现方式&#xff1a; 使用访问修饰符控制成员的可见性 通过属…

[LitCTF 2024]浏览器也能套娃?

打开题目在线环境&#xff1a; 这里尝试填写一个网站回车之后是&#xff1a; 这里想到了ssrf漏洞&#xff1a;ssrf漏洞通常是由于应用程序在处理用户输入时缺乏严格的安全检查&#xff0c;错误地信任外部输入&#xff0c;或者使用的网络请求库配置不当等原因导致的。攻击者可…

明远智睿SSD2351开发板:视频监控领域的卓越之选

随着安全防范意识的提高&#xff0c;视频监控在各个领域得到了广泛应用。明远智睿SSD2351开发板凭借其出色的性能和特性&#xff0c;成为视频监控领域的卓越之选&#xff0c;为视频监控系统的升级和发展提供了有力支持。 SSD2351开发板的四核1.4GHz处理器在视频监控数据处理方面…

threejs加载外部三维模型(gltf)

1. 建模软件绘制3D场景(Blender) 这节课主要给大家科普一些三维模型创建、美术和程序员协作的相关问题。 三维建模软件作用 对于简单的立方体、球体等模型&#xff0c;你可以通过three.js的几何体相关API快速实现&#xff0c;不过复杂的模型&#xff0c;比如一辆轿车、一栋房…

【从零开始系列】Qwen2.5 Llama-Factory:开源语言大模型+训练平台——(超详细、最新版)一篇文章解决:环境搭建 => 微调训练 => 本地部署

目录 一、简介 1.Qwen2.5&#xff1a;开源模型 2. LLaMA-Factory&#xff1a;微调工具 二、环境搭建 1.Python和Pytorch版本 2.llamafactory项目克隆安装 3.其他重要库安装 三、模型微调 1.预训练模型下载 2.训练数据集 ①创建对话文本数据 ②配置dataset_info 3.配置文件与…

git 代码提交规范,feat,fix,chore都是什么意思?

写到前面 经常看到别人提交的代码记录里面包含一些feat、fix、chore等等&#xff0c;而我在提交时也不会区分什么&#xff0c;直接写下提交信息&#xff0c;今天就来看一下怎么个事&#xff0c;就拿 element-plus 举例来看一下 其实这么写是一种代码提交规范&#xff0c;当然…

Gemma 3模型:Google 开源新星,大语言模型未来探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、快速发展的AI世界&#xff1a;为何关注Gemma 3&#x…

2024.11最新Hexo+GitHub搭建个人博客

2024.11最新HexoGitHub搭建个人博客 一、Hexo介绍 Hexo 是一个快速、简洁且高效的博客框架&#xff0c;有丰富的主题和插件可供使用。 Hexo 使用 Markdown&#xff08;或其他标记语言&#xff09;解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页。这…

完美解决 git 报错 “fatal: unable to access ‘https://github.com/.../.git‘: Recv failure Connection was rese

文章目录 方法一&#xff1a;取消代理设置方法二&#xff1a;设置系统代理结语 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xf…

git 拉取Github时报错【 Recv failure: Connection was reset】

问题 当我们电脑能够正常访问Github时&#xff0c;但是git拉取代码出现 &#xff1a; Recv failure: Connection was reset原因 这是因为使用了特殊上网方法&#xff0c;电脑能够正常访问&#xff0c;但是git通过底层访问需要配置代理才能正常访问 解决办法 配置方法如下&…

【PostgreSQL系列】PostgreSQL性能优化

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

如何使用 TortoiseGit 将本地代码回退到指定版本

如何使用 TortoiseGit 将本地代码回退到指定版本 在使用 Git 进行版本控制时&#xff0c;我们可能会遇到需要回退到某个旧版本的情况&#xff0c;比如发现最近的修改引入了问题&#xff0c;或者需要恢复到某个特定的稳定状态。TortoiseGit 是一款非常流行的 Git 图形化工具&am…

航空安全警钟须长鸣 充电宝冒烟再敲警钟

5月31日,CZ6850杭州飞往深圳的航班上,一名旅客携带的相机电池和充电宝突然冒烟。乘务组迅速采取措施,排除了安全风险。为确保安全,机组决定立即返航,航班在起飞15分钟后安全降落。这次事件虽然没有造成人员伤亡,但再次提醒人们航空安全的重要性。任何微小的安全隐患都可能…

玩客云 OEC/OECT 笔记

外观 内部 PCB正面 PCB背面 PCB背面 RK3566 1Gbps PHY 配置 OEC 和 OECT(OEC-turbo) 都是基于瑞芯微 RK3566/RK3568 的网络盒子, 没有HDMI输入输出. 硬件上 OEC 和 OECT 是一样的, 唯一的区别是内存, OEC 内存 2GB 而OECT 内存是 4GB. 产品OECOEC-turboCPURK3566…

InfluxDB 高级函数详解:DERIVATIVE、INTEGRAL、SPREAD、HISTOGRAM 与 DIFFERENCE

在时序数据分析中&#xff0c;除了基础的聚合函数&#xff08;如 MEAN、SUM&#xff09;&#xff0c;InfluxDB 还提供了一系列专门针对时间序列特性的高级函数。这些函数能帮助我们挖掘数据的变化趋势、波动特征和分布规律。下面我们将逐一解析五个关键函数&#xff1a;DERIVAT…

华为OD机试真题—— 最少数量线段覆盖/多线段数据压缩(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《最少数量线段覆盖/多线段数…

古代小孩哥怎么过六一 绿意中撒欢踢毽子

今天是六一儿童节,让我们一起看看古代的孩子们在这一天会玩些什么。古代的童趣VCR展示了高能量小孩哥的日常。他们在绿意盎然的环境中尽情撒欢,青翠的柳荫、碧绿的草地,还有亲密的玩伴。孩子们选择组团踢毽子,只见小孩哥眼神专注,动作轻快,毽子跃起时衣角也随之飘动。旁边…

有捏捏玩具甲醛超标40多倍 安全问题引热议

近日,拥有百万粉丝的捏捏玩具博主“有只猫叫小朋友”在社交平台上发布癌症诊断书,并表示暂停更新。这一举动引发了关于捏捏玩具安全性的讨论。有网友留言称,自己和孩子玩过捏捏玩具后出现了头疼、嗓子疼的情况。捏捏玩具是一种流行的硅胶材质慢回弹类解压玩具,外形多为软萌…