Копирование 14-битного изображения в градациях серого (сохраненного в long []) в pictureBox - PullRequest
1 голос
/ 17 мая 2010

Моя камера выдает мне 14-битные изображения в градациях серого, но функция API возвращает длинную * данные изображения. (поэтому я предполагаю 4 байта для каждого пикселя)

Мое приложение написано на C ++ / CLI, а pictureBox относится к типу .NET.
В настоящее время я использую механизм BitmapData.LockBits(), чтобы получить доступ указателя к данным изображения, и использую
memcpy(bmpData.Scan0.ToPointer(), imageData, sizeof(long)*height*width)
скопировать данные изображения в растровое изображение.
На данный момент единственный работающий PixelFormat - это 32-битный RGB, и изображение отображается в оттенках синего с контурами.

Попытка инициализировать растровое изображение, поскольку 16bppGrayscale не работает.
В идеале я хотел бы привести массив к длинному слову и использовать 16-битный формат (надеюсь, что 14-битные данные будут отображаться правильно), но я не уверен, что это работает. Кроме того, я не хочу перебирать данные изображения, поэтому поиск минимума / максимума и затем растяжение гистограммы до [0..255] не вариант для меня (отображение должно быть максимально эффективным)

Спасибо

1 Ответ

1 голос
/ 17 мая 2010

Да, это будет выглядеть очень синим, некоторые оттенки зеленого для пикселей высокой интенсивности. У вас несоответствие формата пикселя, 32bppRgb имеет один байт для синего, один для зеленого, один для красного и один неиспользованный байт. Непосредственное копирование серого изображения приведет к установке синего байта, до 6 бит зеленого цвета.

16bppGrayScale было бы здорово, если бы только GDI + действительно поддерживал его. Проблема в том, что никакой видеоадаптер основного потока не обрабатывает этот формат. Вам нужно будет перевести значения пикселей в триплет RGB. Чтобы он выглядел серым, вам нужно установить синий, зеленый и красный байты на одно и то же значение. Это будет преобразование с потерями, так как вам нужно сжать 14 бит в 8 бит. Это не имеет большого значения, человеческий глаз недостаточно хорош, чтобы различать 16384 различных уровня серого. Просто сдвиньте значение пикселя вправо на 6, предполагая, что камера выдает значение пикселя 16383 для пикселей с высокой яркостью. Пиксельный формат 24bppRgb или 32bppRgb будет работать, последний будет быстрее, так как он соответствует int, и вам не нужно махать с шагом.

Обратите внимание, что возможны также изображения в ложном цвете. Вы можете произвольно отобразить 14-битное значение серого цвета. Самый быстрый способ сделать это - использовать таблицу отображения int [16384]. То, что вы вставляете в таблицу, полностью зависит от вас, общие отображения - темно-красный для низкой интенсивности, фиолетовый - для высоких значений интенсивности.

Этого достаточно для отображения изображения. Однако, если вы выполняете какую-либо обработку изображения, вам, вероятно, захочется воспользоваться разрешением камеры. Вам нужно держаться подальше от растрового изображения. Проверьте поставщика графической библиотеки, например LeadTools.

...