Как понизить шкалу серого с глубиной 16 бит до изображения с глубиной 8 бит (rgb 24)

Так что я работаю в проекте WPF.

У меня есть два изображения DICOM (рентгеновское изображение (16-битная серая шкала) и оптическое (24-битное RGB) изображение).

Что я хочу

Я хочу смешать два изображения одно на другое, изменив непрозрачность. Это как увеличение или уменьшение непрозрачности между двумя изображениями.

Если я хочу смешать эти два изображения, то я хочу понизить рентгеновское изображение до 8-битной серой шкалы. Таким образом, он будет соответствовать 24-битному оптическому изображению при смешивании.

Моя проблема

Как я могу понизить изображение DICOM с серой шкалой 16 бит до глубины 8 бит (24 бит RGB).

Что я пробовал

Я попытался понизить изображение, используя PixelFormats.

stride = width * 4;
size = height * stride;
bitmapSource = BitmapImage.Create(width, height, 96, 96, System.Windows.Media.PixelFormats.Gray8, null, bitmapBuffer, stride);

Но если бы я попытался использовать приведенный выше код, полученное изображение выглядит зернистым и имеет некоторые потери. Что я могу сделать, чтобы сохранить качество изображения и одновременно понизить его.

Пожалуйста, помогите мне. Я новичок в области обработки изображений и DICOM.

1 ответ

Решение

Я не вижу шансов использовать какой-либо Microsoft API для этого. В заголовке DICOM есть много атрибутов, которые вы должны учитывать:

  • (0028,0101) Сохраненные биты говорят вам реальное количество бит, используемых данными пикселей. Обязательно замаскируйте неиспользованные биты - они могут содержать случайные биты
  • (0028,0004) Фотометрическая интерпретация говорит вам, нужно ли инвертировать изображение до уменьшения масштаба (MONOCHROME1 -> Identity, MONOCHROME2 -> Invert)
  • (0028,3000) Модальность Последовательность LUT может указывать нелинейное преобразование данных пикселей, которое следует учитывать
  • (0028,0103) Пиксельное представление указывает, следует ли интерпретировать двоичные значения пикселей как целые числа без знака или как 2-е дополнения целых чисел со знаком

Следующий вопрос: какова цель сокращения

  • Необработанные данные о пикселях в том виде, в каком они есть - тогда вы можете просто перемасштабировать пиксели (потенциально сопоставленные LUT модальности) с новым диапазоном.
  • Изображение, как оно должно восприниматься врачом - тогда нужно учитывать и другие атрибуты

В последнем случае применяются следующие преобразования

  • Rescale Slope / Intercept (0028,1053) / (0028,1052) определяют линейное преобразование данных пикселей в диапазон значений, измеренный устройством. Нередко, но не запрещено, чтобы значения пикселей превышали 16 бит после преобразования
  • Центр окна / Ширина (0028,1050) / (0028,1051) определяют диапазон данных пикселей, которые должны отображаться в 8-бит. Может присутствовать более одного набора Window/Level, поэтому сложность будет в том, чтобы выбрать подходящий.

РЕДАКТИРОВАТЬ: После того, как выяснилось, что эта функциональность должна быть включена в интерактивный интерфейс, я рекомендую: Считать данные пикселей в "родном" формате путем объединения атрибутов, которые определяют, как данные пикселей должны интерпретироваться (см. Выше), На этом шаге вы получаете промежуточное представление, в котором данные пикселей представляются в виде измеренных значений с устройства в формате целых чисел без знака 32/64. Затем выберите первый набор Window/Center из заголовка DICOM, чтобы определить масштабирование до 8 бит (см. Здесь). Но позвольте пользователю выбрать другие наборы окон / центров из заголовка, если он есть, и разрешите ему настроить его вручную.

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