0

我正在尝试读取 12 位灰度 (DICOM:MONOCHROME2) 图像。我可以很好地读取 DICOM RGB 文件。当我尝试将灰度图像加载到 NSBitmapImageRep 中时,我收到以下错误消息:

Inconsistent set of values to create NSBitmapImageRep

我有以下代码片段:

NSBitmapImageRep *rep = [[NSBitmapImageRep alloc]
                         initWithBitmapDataPlanes : nil
                         pixelsWide               : width
                         pixelsHigh               : height
                         bitsPerSample            : bitsStored
                         samplesPerPixel          : 1
                         hasAlpha                 : NO
                         isPlanar                 : NO
                         colorSpaceName           : NSCalibratedWhiteColorSpace
                         bytesPerRow              : width * bitsAllocated / 8
                         bitsPerPixel             : bitsAllocated];

使用这些值:

width         = 256
height        = 256
bitsStored    = 12
bitsAllocated = 16

对我来说似乎没有什么不一致的。我已经验证了图像的长度是:宽*高*2。所以我很确定它是 2 字节灰度格式。我尝试了许多参数的变体,但没有任何效果。如果我将“bitsPerSample”更改为 16,错误消息就会消失,但我会得到一个纯黑色图像。我能够取得的最接近的成功是将“bitsPerPixel”设置为零。当我这样做时,我成功地生成了一个图像,但它显然被错误地渲染了(你几乎无法辨认出原始图像)。请给点建议!!我已经尝试了很长时间才能使其正常工作,并检查了堆栈溢出和网络(很多次)。非常感谢您的帮助!

解决方案:

在 LEADTOOLS Support 提供了非常有用的建议之后,我能够解决我的问题。这是有效的代码片段(假设是 MONOCHROME2 DICOM 图像):

// If, and only if, MONOCHROME2:
NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc]
                              initWithBitmapDataPlanes : &pixelData
                              pixelsWide               : width
                              pixelsHigh               : height
                              bitsPerSample            : bitsAllocated /*bitsStored-this will not work*/
                              samplesPerPixel          : samplesPerPixel
                              hasAlpha                 : NO
                              isPlanar                 : NO
                              colorSpaceName           : NSCalibratedWhiteColorSpace
                              bytesPerRow              : width * bitsAllocated / 8
                              bitsPerPixel             : bitsAllocated];

int     scale = USHRT_MAX / largestImagePixelValue;
uint16_t *ptr = (uint16_t *)imageRep.bitmapData;
for (int i = 0; i < width * height; i++) *ptr++ *= scale;
4

1 回答 1

0

了解传输语法 (0002:0010) 和数据集中的帧数非常重要。此外,尝试获取像素数据 (7FE0:0010) 元素的值长度和 VR。使用像素数据元素的值长度,您将能够验证未压缩图像的计算。

至于显示图像,您还需要 High Bit (0028:0102) 和 Pixel Representation (0028:0103) 的值。图像可以分配 16 位,存储 12 位,高位设置为 15,并且每个像素有一个样本。这意味着每个字的 4 个最低有效位不包含像素数据。设置为 1 时的 Pixel Representation 表示符号位是像素样本中的高位。此外,当存在于数据集中时,您需要应用模态 LUT 变换(线性变换的重新缩放斜率和重新缩放截距)以准备数据以供显示。最后,应用 VOI LUT 变换(窗口中心和窗口宽度)来显示图像。

于 2015-03-03T18:05:24.853 回答