我正在使用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时,一切似乎都可以,我可以看到图像! : - (
现在我有两个问题:
答案 0 :(得分:5)
关键是 Pixel Representation (0028,0106)数据元素。
PixelRepresentation = 0 -> unsigned
PixelRepresentation = 1 -> signed
在您的情况下,您的值为'1',因此您必须将值读取并解释为有符号整数。
您可以找到其他信息here。
答案 1 :(得分:2)
从未使用过dcmtk,但看起来你必须应用模态VOI的斜率/截距参数才能获得正确的数字。
请参阅rescale slope and rescale intercept和Window 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工具包完全相关。