3

我正在使用 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 获取真实数据吗?
4

5 回答 5

6

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

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

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

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

于 2013-05-29T07:42:23.900 回答
3

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

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

于 2013-05-29T13:36:01.297 回答
0

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

于 2013-06-01T07:00:06.460 回答
0

我找到了答案。优秀的官方开发人员已在此处进行了解释。请参见第 2 页。它与 DCMTK 工具包完全相关。

于 2013-06-09T18:19:36.657 回答
0

根据文档 getOutputData 在渲染之前应用演示文稿 VOI,因此您始终会获得未签名的数据。因此,如果您要求 16 位数据,您将获得 0 到 65535 之间的像素,而不管数据集中指定的最小值和最大值是多少;这是因为返回的数据是要显示的,而不是存储在图像中的原始数据。我认为您应该将值右移 8 位,或者只要求 8 位数据(即使图像是 16 位):我认为您的显卡无论如何都不能处理 16 位灰度。

于 2013-05-31T21:35:17.063 回答