【转】关于DCMTK中像素存储以及getoutdata()函数的使用

转自:https://blog.csdn.net/ancewer/article/details/73277895 有删改

当你看这个帖子的时候,假设你也因为这个问题而感到困惑。

  在使用这个函数的时候纠结了很久,各种google、百度都没查到相关资料,测试了好多次,并计算了许多二进制像素值,才终于搞明白,getoutdata()里的参数到底应该怎么写;

  首先我们需要弄清楚dicom文件中单个像素值是怎么存的,说下一般的情况,以16位二进制方式存储为例,分析需要通过pixel模块的,bitstored, bitsallocated, highbit, pixel representation这四个值。

  • pixel representation
    pixel representation的值有0和1两种,0代表无符号,1代表有符号,比如二进制1001如果是无符号存储,表示9,如果是有符号(第一位代表符号位)的话就是-1;二进制0001不管是有符号还是无符号都代表1。
  • bitsallocated
    bitsallocated表示用多少位来储存,通俗来说就是开辟多少空间来存一个像素值,bitsallocated的存在是为了凑整,8或16或32,方便二进制计算.
  • bitstored
    在CT中一般bitsallocated=16位,因为16位所占空间很大,肯定是用不完的,所以又有bitstored这个值来表示用bitsallocated中的多少位来存像素值,剩余几位全部置0就行了。
  • highbit
    因为像素值可能是有符号或无符号highbit这个值的存在是为了确定符号位(Highbit位是符号位,则有符号时有效位只有bitsstored-1位)。

下面举几个例子:

  • 例1:pixel representation=0, bitsallocated=16, bitsstored=12, highbit=11,假设像素值为100,按照标准存储如下:
    |0000|0000|0110|0100|
  • 例2:pixel representation=1, bitsallocated=16, bitsstored=12, highbit=11,假设像素值为100,按照标准存储如下:
    |0000|1000|0110|0100|
  • 例3:pixel representation=1, bitsallocated=16, bitsstored=16, highbit=15,假设像素值为100,按照标准存储如下:
    |1000|0000|0110|0100|

特别注意

其实上面例2、例3都是错的,没看出来么?

  上面的储存方式是我们人脑所方便理解的,但对于计算机而言,负数如果是这么存储的话,计算机处理时候需要先做个判断,第一位是不是1,然后再计算,这显然对于傻瓜的只能处理0、1的计算机而言是个沉重的负担,所以负数的存储用了补码(想深入理解原码、反码、补码推荐博客),对于正数而言补码还是其本身,对于负数而言补码是撇除符号位后进行反码运算后+1。
所以:

  • 例2的真实存储情况是|0000|1111|1001|1100|
    其实例2这种情况只是我臆想的,真是应该是不存在的,一般按照例1或例3这种比较规律的方式,当然,储存情况是厂家订制的,鬼知道他们会怎么干。
  • 例3的真实存储情况是|1111|1111|1001|1100|

考虑大端小端后

前面都是没有考虑大小端情况,对于不同系统存储方式有大端、小端的区别(大端、小端知识可以参考博文),所以若是大端的则不用变化,如果是小端,则结果为:

  • 例1的存储情况是|0100|0110|0000|0000|
  • 例2的存储情况是|1100|1001|1111|0000|
  • 例3的存储情况是|1100|1001|1111|1111|

关于getoutdata()

  DicomImage类中getoutdata()函数的使用与上述储存情况息息相关,函数参数作用是取bitsstored的后面多少位,函数参数设为bitsstored的值,然后读出的来的值为实际像素值(自己对有符号无符号进行转换)

DicomImage *image = new DicomImage("test.dcm");
Uint16* a= (Uint16*)image->getOutputData(12);
vector<Uint16> PixelData;
for (int i = 0; i < 512 * 512; i++)
{PixelData.push_back(*(a + i));
}

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

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

相关文章

【Visual C++】游戏开发笔记三十五 站在巨人的肩膀上:游戏引擎导论

看到在留言中很多朋友提到不太清楚DirectX与游戏引擎的区别的问题&#xff0c;在这里浅墨就专门把自己对游戏引擎的一些理解写成一篇文章&#xff0c;作为我们《Visual C游戏开发》专栏的游戏引擎导论&#xff0c;也希望能通过这篇文章&#xff0c;能让大家有所启发&#xff0c…

String ... String 三个点 jdk1.5的特性.才知道

String ... String 三个点 jdk1.5的特性.才知道 String... excludeProperty表示不定参数&#xff0c;也就是调用这个方法的时候这里可以传入多个String对象。public static void main(String[] args) {//测试&#xff0c;传入多个参数test("hello", "world"…

c语言大数相加oj,郑州轻工业大学oj题解(c语言)论如何正确的提高正确率:水题合集(四)...

好像离上一篇水题篇过去已经快半个月了~也是好久没有发过这些简单又有趣的题目了呢&#xff0c;今天想起来就总结几道吧。今天是看龙族的一天~ 花了一下午时间把《龙族2》看了2/3&#xff0c;看书的时间真的过的飞快&#xff0c;听着歌翻着书&#xff0c;一会4.5个小时就过去了…

【转】DICOM:DICOM Print服务中PresentationContext协商之 MetaSOPClass与SOPClass对比分析!!!!!!!!

转自&#xff1a;https://zssure.blog.csdn.net/article/details/45119841 背景&#xff1a; 最近项目中遇到的实际问题较多&#xff0c;且大多是较隐蔽的、不易被发现的错误。究其根源来看&#xff0c;还是对DICOM3.0协议中的细节掌握不够仔细&#xff0c;因而导致在实际编码…

2008秋季-计算机软件基础-未交实验报告名单

实验四 序号&#xff1a;108 实验五 序号&#xff1a;108&#xff0c;225&#xff0c;226 351 实验二 353 实验一 356 实验二 360 实验三 365 实验三 367 实验三 368 实验二 372 实验五 转载于:https://www.cnblogs.com/emanlee/archive/2008/11/02/1324910.html

操作系统真实的虚拟内存是什么样的

1. 内存及虚存基本布局 提起虚存&#xff0c;大都能说出几条来。 对于32位系统&#xff0c;大多数操作系统都会将4GB的内存空间的一部分挪给内核使用&#xff0c;应用程序无法直接访问这一段内存&#xff0c;这部分内存空间称为内核空间。Windows默认情况下会将高地址的2GB分配…

约瑟夫问题c语言链表解法,约瑟夫环问题 --链表 C语言

总共有m个人在圆桌上&#xff0c;依次报名&#xff0c;数到第n个数的人退出圆桌&#xff0c;下一个由退出人下一个开始继续报名&#xff0c;循环直到最后一个停止将编号输出#include #include typedef struct Head * PHead;typedef struct Node * PNode;struct Head{PNode Next…

【转】用fo-dicom实现print scu的注意事项!!!!!!!!!

转自&#xff1a;https://blog.csdn.net/tvsofa2008/article/details/50245357 用fo-dicom实现print scu的注意事项 fo-dicom是一个开源的协议库&#xff0c;开发语言是c#。网上针对fo-dicom的分析也有不少&#xff0c;但是专门针对dicom print的文章还是太少了。 近几天需要…

DELPHI串口通讯编程

spcomm更加简单 转贴 Delphi中串口通信的实现 河南省计算中心 张海航 -------------------------------------------------------------------------------- Delphi是一种具有功能强大、简便易用和代码执行速度快等优点的可视化快速应用开发工具&#xff0c;它在…

设计模式C++实现 ——观察者模式

观察者模式&#xff1a;定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。它还有两个别名&#xff0c;依赖(Dependents)&#xff0c;发布-订阅(Publish-Subsrcibe)。可以举个博客订阅的例子&…

【转】DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/8784980 DCMTK开源库介绍&#xff1a; DCMTK是目前最全面实现DICOM3.0标准的开源库&#xff0c;通过结合DCMTK开源库和CxImage图像开源库&#xff0c;能够很方便的开发属于自己的DCM文件编辑浏览软件。 DCMT…

如何将C语言翻译成汇编语言,如何把汇编语言转换成C语言

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼程序:ORG 0000HLJMP MAINORG 000BHLJMP TIMEORG 1000HHOUR1 EQU 10hHOUR2 EQU 12hMIN1 EQU 14hMIN2 EQU 16hSEC1 EQU 18HCOUNT EQU 20HNUM1 EQU 22HNUM2 EQU 24HLL4 EQU 26Hs1 bit P1.0s2 bit P1.1s3 bit P1.2s4 bit P1.3A1 EQU 36…

数据库-Oracle【Oracle数据库设置默认表空间问题及Oracle,SQL,MySQL的自增变量设置】...

一、 Oracle数据库设置默认表空间问题 DBA们经常会遇到一个这样令人头疼的问题&#xff1a;不知道谁在Oracle上创建了一个用户&#xff0c;创建时&#xff0c;没有给这个用户指定默认表空间&#xff0c;所以这个用户就会采用默认的表空间——system表空间。导致系统表空间迅速被…

设计模式——Iterator模式实现研究

导读&#xff1a;软件设计模式是一种表达、记录和重用软件设计结构和设计经验的新方法&#xff0c;它对反复出现的设计结构的关键特征进行识别、抽象和命名&#xff0c;使重用成功设计和结构更加容易。本文介绍了软件设计模式的特点、描述方式以及在设计中使用模式带来的好处&a…

【转】DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/8785132 DCMTK官网给出了JPEG格式压缩的DCM文件解压缩的方法&#xff08;http://support.dcmtk.org/docs/mod_dcmjpeg.html&#xff09;&#xff0c;代码摘录如下&#xff1a; DJDecoderRegistration::regist…

R语言处理非线性回归模型C-D方程,使用R语言进行多项式回归、非线性回归模型曲线拟合...

对于线性关系&#xff0c;我们可以进行简单的线性回归。对于其他关系&#xff0c;我们可以尝试拟合一条曲线。曲线拟合是构建一条曲线或数学函数的过程&#xff0c;它对一系列数据点具有最佳的拟合效果。使用示例数据集#我们将使Y成为因变量&#xff0c;X成为预测变量#因变量通…

认识IL

1.要编译的代码如下&#xff1a; using System; using System.Collections.Generic; using System.Text; namespace HellowWorld { class Program { static void Main() { Console.Write("Hello World!"); } } } 2…

c语言之多线程函数,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …

Iterator模式

Iterator模式的几种用法 在网络上看帖子时发现不少模式的初学者对Iterator模式的理解仅仅停留在从类库的容器类取得Iterator来遍历容器中的内容的程度。 因此在这里写几个例子&#xff0c;来加深大家对Iterator模式的理解。 对容器中元素的访问涉及到3个方面。 1&#xff0e;容…

【转】DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/8804736 dcm文件是医学领域DICOM3.0标准所对应的主要的文件格式。前两篇学习笔记中&#xff0c;学习了读取dcm文件的相关信息&#xff0c;如信息头MetaInformation元素、像素数据元素&#xff0c;只停留在了读…