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

【C#】获取DICOM图像像素的像素值

8位像素深度的像素值

public byte GetGreyValue(int x, int y)
{x = Math.Min(x, m_nWidth - 1);y = Math.Min(y, m_nHeight - 1);unsafe{byte* greyValue = (byte*)m_pDicomData.ToPointer() + y * m_nWidth + x;return *greyValue;}
}

16位像素深度的像素值

public ushort GetGreyValue(int x, int y)
{x = Math.Min(x, m_nWidth - 1);y = Math.Min(y, m_nHeight - 1);unsafe{ushort* greyValue = (ushort*)m_pDicomData.ToPointer() + y * m_nWidth + x;return *greyValue;}
}

RGB(3通道)类型的像素值

public Tuple<byte, byte, byte> GetRGBValue(int x, int y)
{x = Math.Min(x, m_nWidth - 1);y = Math.Min(y, m_nHeight - 1);unsafe{byte* pixelData = (byte*)m_pDicomData.ToPointer() + y * m_nWidth * 3 + x * 3;byte r = pixelData[0]; // Red componentbyte g = pixelData[1]; // Green componentbyte b = pixelData[2]; // Blue componentreturn Tuple.Create(r, g, b);}
}

 在这个例子中,我们假设像素数据是按R-G-B顺序存储的,并且每个分量都是8位的。m_pOutData 应该指向图像数据的起始位置,m_nWidth 是图像的宽度,因为我们每次读取像素时需要跳过3个字节(R、G、B)。

然而,实际情况可能会有所不同,因为DICOM标准允许不同的像素表示方式,包括像素深度、字节序以及颜色分量的排列。例如,一些DICOM图像可能使用16位RGB,这意味着每个颜色分量占用16位,或者可能是B-G-R顺序。

为了正确处理DICOM图像的RGB数据,你需要考虑以下几点:

  1. 像素表示:确定每个颜色分量的位数和图像的总位数。
  2. 字节序:确认数据是大端还是小端存储。
  3. 颜色分量顺序:确认R、G、B分量的存储顺序。
  4. DICOM元数据:利用DICOM文件中的元数据来确定上述信息,这些信息可以在DICOM标签中找到。

通常,使用一个DICOM库(如DcmQRScu、DCMTK、GDAL或Dcm4che)来解析DICOM文件并处理像素数据是最简单和最可靠的方式。这些库能够自动处理上述所有细节,让你可以直接访问图像数据而无需手动编写复杂的低级代码。

ushort和byte的区别 

ushortbyte 都是 C# 中的基本数值类型,但它们在大小、范围和用途上有所不同。

byte

byte 类型是一个无符号的整数类型,它占用 1 个字节(8 位)。这意味着它可以存储从 0 到 255 的整数值。byte 类型经常用于以下场景:

  • 存储小范围的非负整数。
  • 处理单个字符或 ASCII 编码。
  • 存储图像的像素值,尤其是在 8 位灰度或颜色图像中。
  • 网络编程中,处理二进制数据或网络协议数据单元(PDU)。

ushort

ushort 类型也是一个无符号的整数类型,但它占用 2 个字节(16 位)。它可以存储从 0 到 65535 的整数值。ushort 类型适用于:

  • 存储更大的非负整数值,比 byte 提供了更大的范围。
  • 在音频样本、16 位图像数据或需要更大动态范围的应用中存储数据。
  • 用于标识或索引,尤其是当 byte 的范围不足以覆盖所有可能的值时。

总结

  • 大小byte 占用 1 字节(8 位),ushort 占用 2 字节(16 位)。
  • 范围byte 范围是 0 至 255,ushort 范围是 0 至 65535。
  • 用途byte 更适合存储小范围的非负整数,而 ushort 适合存储较大的非负整数。

在选择使用哪种类型时,应考虑到所需值的范围以及存储效率。如果值永远不会超过 255,使用 byte 可能更节省内存;如果值可能达到几千或几万,使用 ushort 更合适。在处理图像和声音数据时,这一点尤其重要,因为这些数据通常以特定的位深度(如 8 位或 16 位)编码。

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【CTFWP】ctfshow-web42
  • Spark实时(一):StructuredStreaming 介绍
  • 推荐系统三十六式学习笔记:工程篇.常见架构25|Netflix个性化推荐架构
  • 【SpringBoot教程:从入门到精通】掌握Springboot开发技巧和窍门(四)-Vue项目配置环境、导航栏
  • MySQL常见指令
  • Python 高阶语法
  • MiniExcel:.NET中处理Excel的高效方案
  • 金蝶插件调用HTTP请求 并解析JSON
  • RabbitMQ普通集群搭建指南
  • 【React】JSX:从基础语法到高级用法的深入解析
  • 【云原生】Docker搭建知识库文档协作平台Confluence
  • Vue入门记录(一)
  • XSSFWorkbook 和 SXSSFWorkbook 的区别
  • Torchvision.dataset CIFAR等数据集使用
  • vue 给特定满足条件的表单数据添加背景颜色,组件的 row-class-name
  • @angular/forms 源码解析之双向绑定
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【Linux系统编程】快速查找errno错误码信息
  • Android框架之Volley
  • Git学习与使用心得(1)—— 初始化
  • LeetCode算法系列_0891_子序列宽度之和
  • mysql 5.6 原生Online DDL解析
  • Vue 重置组件到初始状态
  • 大主子表关联的性能优化方法
  • 欢迎参加第二届中国游戏开发者大会
  • 力扣(LeetCode)357
  • - 转 Ext2.0 form使用实例
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 数据可视化之下发图实践
  • ​ArcGIS Pro 如何批量删除字段
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​zookeeper集群配置与启动
  • ‌移动管家手机智能控制汽车系统
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (1)(1.11) SiK Radio v2(一)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (k8s)Kubernetes本地存储接入
  • (k8s中)docker netty OOM问题记录
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (计算机网络)物理层
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core 项目指定SDK版本
  • .NetCore发布到IIS
  • .NET企业级应用架构设计系列之结尾篇
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题