当前位置: 首页 > article >正文

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

背景: 

在从零开始的二三维软件开发中, 需要加载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.lryc.cn/news/2394558.html

相关文章:

  • android协程异步编程常用方法
  • 【计算机网络】应用层协议Http——构建Http服务服务器
  • 【求A类B类月】2022-2-9
  • 信息安全之为什么引入公钥密码
  • linux版本vmware修改ubuntu虚拟机为桥接模式
  • pytest 常见问题解答 (FAQ)
  • 从0到1上手Trae:开启AI编程新时代
  • HTTPS 协议:数据传输安全的坚实堡垒
  • Spring Boot中使用@JsonAnyGetter和@JsonAnySetter处理动态JSON属性
  • Spring Boot测试框架全面解析
  • Linux之MySQL安装篇
  • Asp.Net Core 如何配置在Swagger中带JWT报文头
  • 第12讲、Odoo 18 权限控制机制详解
  • 8086 处理器 Flags 标志位全解析:CPU 的 “晴雨表” 与 “遥控器”总结:
  • 具有离散序列建模的统一多模态大语言模型【AnyGPT】
  • PHP HTTP 完全指南
  • 物流项目第九期(MongoDB的应用之作业范围)
  • 系统思考:经营决策沙盘
  • [网页五子棋][对战模块]实现游戏房间页面,服务器开发(创建落子请求/响应对象)
  • 数据结构-代码总结
  • 快速掌握 GO 之 RabbitMQ
  • SQL Server 事务详解:概念、特性、隔离级别与实践
  • MAC软件游戏打开提示已损坏
  • React基础教程(13):路由的使用
  • 力扣刷题(第四十三天)
  • Centos环境下安装/重装MySQL完整教程
  • 【Linux】环境变量完全解析
  • 【Java】mybatis-plus乐观锁-基本使用
  • 力扣每日一题——找到离给定两个节点最近的节点
  • 机器学习与深度学习03-逻辑回归01