Я использую 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, все кажется нормальным, и я могу видеть изображения! 🙁
Теперь у меня есть два вопроса:
Ключ является Пиксельное представление (0028,0106) элемент данных.
PixelRepresentation = 0 -> unsigned
PixelRepresentation = 1 -> signed
В вашем случае у вас есть значение «1», поэтому вы должны прочитать и интерпретировать значения как целые числа со знаком.
Вы можете найти дополнительную информацию Вот.
Никогда не использовал dcmtk, но похоже, что вы должны применить параметры наклона / пересечения модальности VOI, чтобы получить правильные числа.
Увидеть изменить масштаб наклона и изменить масштаб а также Ширина окна и центр расчета изображения DICOM.
Согласно документации getOutputData применяет VOI презентации перед рендерингом, поэтому вы всегда получаете неподписанные данные.
Итак, если вы запросите 16-битные данные, вы получите пиксели в диапазоне от 0 до 65535, независимо от минимальных и максимальных значений, указанных в наборе данных; это потому, что возвращаемые данные предназначены для отображения, это не исходные данные, хранящиеся в изображении.
Я думаю, что вы должны просто сдвинуть значения на 8 бит или просто запросить 8-битные данные (даже если изображение 16-битное): я не думаю, что ваша графическая карта в любом случае может обрабатывать 16-битную шкалу серого.
заголовок DICOM говорит, что данные хранятся в файле DICOM как значение со знаком, но похоже, что документация говорит, что getOutputData преобразует их в значение без знака. Итак, попробуйте прочитать вывод getOutputData как uint16_t вместо int16_t.
Я нашел ответ. Это объяснили Вот хорошими официальными разработчиками. См. Страницу 2. Это полностью связано с инструментарием DCMTK.