我正在尝试读取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”设置为零。当我这样做时,我成功地生成了一个图像,但它显然被错误地渲染(你几乎看不出原始图像)。请一些建议!!我已经尝试了很长时间才能使用它并检查了堆栈溢出和Web(很多次)。非常感谢您的帮助!
解决方案:
在LEADTOOLS支持的非常有用的建议之后,我能够解决我的问题。这是有效的代码片段(假设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;
答案 0 :(得分:0)
了解传输语法(0002:0010)和数据集中的帧数非常重要。此外,尝试获取像素数据(7FE0:0010)元素的值长度和VR。使用像素数据元素的值长度,您将能够验证未压缩图像的计算。
至于显示图像,您还需要高位(0028:0102)和像素表示(0028:0103)的值。图像可以是16位分配,12位存储,高位设置为15,每个像素有一个样本。这意味着每个字的有效位不包含像素数据。设置为1时的像素表示意味着符号位是像素采样中的高位。 此外,当数据集中存在用于准备显示数据时,您需要应用模态LUT变换(重新缩放斜率和线性变换的重新缩放截距)。最后,应用VOI LUT变换(窗口中心和窗口宽度)以显示图像。