Как понизить шкалу серого с глубиной 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 бит (см. Здесь). Но позвольте пользователю выбрать другие наборы окон / центров из заголовка, если он есть, и разрешите ему настроить его вручную.