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

时间:2013-05-28 23:46:13

标签: c++ dicom imaging

我正在使用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的值,它会好吗?图片上没有padding value
  2. getOutputData的文档中,它说的是渲染的像素数据总是无符号的。。当我的图像数据被签名时,这意味着什么,因为(0028,0103)属性对我说了什么?如果这种方法不正确,那么我可以通过dcmtk获取实际数据吗?

5 个答案:

答案 0 :(得分:5)

关键是 Pixel Representation (0028,0106)数据元素。

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

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

您可以找到其他信息here

答案 1 :(得分:2)

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

请参阅rescale slope and rescale interceptWindow width and center calculation of DICOM image

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我找到了答案。它已经由优秀的开发人员解释here。请参阅第2页。它与DCMTK工具包完全相关。