NSBitmapImageRep: несоответствующий набор значений

Я пытаюсь прочитать 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 я смог решить свою проблему. Вот фрагмент кода, который работает (при условии, что DICOM-образ MONOCHROME2):

// 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;

1 ответ

Решение

Важно знать о синтаксисе передачи (0002:0010) и количестве кадров в наборе данных. Также попробуйте получить значение длины и VR для элемента Pixel Data (7FE0:0010). Используя значение длины элемента данных пикселя, вы сможете проверить свой расчет для несжатого изображения.

Что касается отображения изображения, вам также понадобятся значения для High Bit (0028:0102) и Pixel Presentation (0028:0103). Изображение может быть 16-битным, 12-битным, старшим битом, равным 15, и иметь одну выборку на пиксель. Это означает, что 4 значащих бита каждого слова не содержат пиксельных данных. Представление пикселей при значении 1 означает, что знаковый бит является старшим битом в выборке пикселей. Кроме того, многие из них должны применять модальное преобразование LUT (изменение масштаба наклона и пересечение изменения масштаба для линейного преобразования), когда оно присутствует в наборе данных, для подготовки данных к отображению. В конце вы применяете преобразование VOI LUT (Центр окна и Ширина окна) для отображения изображения.

Другие вопросы по тегам