NSBitmapImageRep:不一致的值集
NSBitmapImageRep: Inconsistent set of values
我正在尝试读取 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
我觉得没有什么不一致的。我已经验证图像是:width*height*2 in length。所以我很确定它是 2 字节的灰度格式。我尝试了多种参数变体,但没有任何效果。如果我将 "bitsPerSample" 更改为 16,则错误消息消失,但我得到纯黑图像。我能够取得的最接近的成功是将 "bitsPerPixel" 设置为零。当我这样做时,我成功地生成了一个图像,但它显然被错误地渲染了(你几乎无法辨认出原始图像)。请一些建议!我已经尝试了很长时间来让它工作,并检查了 Stack overflow 和网络(多次)。非常感谢您的帮助!
解决方案:
在 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;
了解数据集中的传输语法 (0002:0010) 和帧数很重要。此外,尝试获取像素数据 (7FE0:0010) 元素的值长度和 VR。使用像素数据元素的值长度,您将能够验证您对未压缩图像的计算。
至于显示图像,您还需要 High Bit (0028:0102) 和 Pixel Representation (0028:0103) 的值。图像可以分配 16 位,存储 12 位,高位设置为 15,并且每个像素有一个样本。这意味着每个字的 4 个最低有效位不包含像素数据。 Pixel Representation 设置为 1 表示符号位是像素样本中的高位。
此外,当出现在数据集中时,您可能需要应用模态 LUT 转换(重新缩放斜率和重新缩放线性转换的截距)以准备显示数据。最后,您应用 VOI LUT 转换(Window 中心和 Window 宽度)来显示图像。
我正在尝试读取 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
我觉得没有什么不一致的。我已经验证图像是:width*height*2 in length。所以我很确定它是 2 字节的灰度格式。我尝试了多种参数变体,但没有任何效果。如果我将 "bitsPerSample" 更改为 16,则错误消息消失,但我得到纯黑图像。我能够取得的最接近的成功是将 "bitsPerPixel" 设置为零。当我这样做时,我成功地生成了一个图像,但它显然被错误地渲染了(你几乎无法辨认出原始图像)。请一些建议!我已经尝试了很长时间来让它工作,并检查了 Stack overflow 和网络(多次)。非常感谢您的帮助!
解决方案:
在 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;
了解数据集中的传输语法 (0002:0010) 和帧数很重要。此外,尝试获取像素数据 (7FE0:0010) 元素的值长度和 VR。使用像素数据元素的值长度,您将能够验证您对未压缩图像的计算。
至于显示图像,您还需要 High Bit (0028:0102) 和 Pixel Representation (0028:0103) 的值。图像可以分配 16 位,存储 12 位,高位设置为 15,并且每个像素有一个样本。这意味着每个字的 4 个最低有效位不包含像素数据。 Pixel Representation 设置为 1 表示符号位是像素样本中的高位。 此外,当出现在数据集中时,您可能需要应用模态 LUT 转换(重新缩放斜率和重新缩放线性转换的截距)以准备显示数据。最后,您应用 VOI LUT 转换(Window 中心和 Window 宽度)来显示图像。