繁体   English   中英

当我使用dcmtk时,为什么要从2 ^ 15中减去我的dicom图像的像素值?

[英]Why should I subtract my pixel values of dicom image from 2^15 when I'm using dcmtk?

我正在使用dcmtk来读取dicom图像,我对新样本有以下属性:

(0028,0004) Photometric Interpretation: MONOCHROME2
(0028,0010) Rows: 512
(0028,0011) Columns: 512
(0028,0030) Pixel Spacing: 0.4688\0.4688
(0028,0100) Bits Allocated: 16
(0028,0101) Bits Stored: 16
(0028,0102) High Bit: 15
(0028,0103) Pixel Representation: 1
(0028,0106) Smallest Image Pixel Value: 0
(0028,0107) Largest Image Pixel Value: 2732
(0028,1050) Window Center: 1366
(0028,1051) Window Width: 2732

我使用getOutputData(16)来读取int16_t数据。 令我感到惊讶的是,因为接近-1 *(2 ^ 16)的值是负值,当我将值减去2 ^ 15时,一切似乎都可以,我可以看到图像! :-(

现在我有两个问题:

  1. 为什么我要减去2 ^ 15的值,它会好吗? 图像上没有可用的填充值
  2. getOutputData的文档中,它讲的是渲染的像素数据总是无符号的。 当我的图像数据被签名时,这意味着什么,因为(0028,0103)属性对我说了什么? 如果这种方法不正确,那么我可以通过dcmtk获得真实数据吗?

关键是像素表示 (0028,0106)数据元素。

PixelRepresentation = 0 -> unsigned
PixelRepresentation = 1 -> signed

在您的情况下,您的值为'1',因此您必须读取并将值解释为有符号整数。

您可以在此处找到更多信息。

从未使用过dcmtk,但看起来你必须应用模态VOI的斜率/截距参数才能获得正确的数字。

请参阅重新缩放斜率和重新缩放截距以及DICOM图像的窗口宽度和中心计算

根据文档,getOutputData在呈现之前应用表示VOI,因此您始终可以获得未签名的数据。 因此,如果要求16位数据,无论数据集中指定的最小值和最大值如何,您都将获得从0到65535的像素范围; 这是因为要显示返回的数据,它不是存储在图像中的原始数据。 我认为你应该正确地将值移位8位,或者只是要求8位数据(即使图像是16位):我认为如果灰度无论如何你的图形卡都不能处理16位。

DICOM标题表示数据作为有符号值存储在DICOM文件中,但看起来文档说getOutputData将其转换为无符号值。 所以,尝试将getOutputData的输出读取为uint16_t而不是int16_t。

我找到了答案。 它由好的开发人员在这里解释。 请参阅第2页。它与DCMTK工具包完全相关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM