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

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

本文关键字:dicom 图像 像素 dcmtk 我要 为什么      更新时间:2023-10-16

我正在使用dcmtk读取dicom图像,并且我在新示例中具有以下属性:

(0028,0004) Photometric Interpretation: MONOCHROME2
(0028,0010) Rows: 512
(0028,0011) Columns: 512
(0028,0030) Pixel Spacing: 0.4688.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的文档中,它说的是渲染的像素数据总是unsigned.。当我的图像数据因为(0028,0103)属性而被签名时,这意味着什么?如果这个方法不合适,那么我可以通过dcmtk得到真实的数据吗?

关键是Pixel Representation(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工具包完全相关。