RGB565 в оттенках серого - PullRequest
1 голос
/ 18 октября 2019

Я пытаюсь преобразовать RGB565 в изображение в градациях серого.

Я использовал приведенный ниже код для преобразования. У меня есть пиксель rgb565. Я получаю значения R, G и B и выполняю операцию преобразования. После получения оттенков серого я восстанавливаю 16-битные значения пикселей, в которых R, G и B будут иметь одинаковое значение оттенков серого.

 int16_t pixel = *buffer;
 int16_t red = ((pixel & 0xF800)>>11);
 int16_t green = ((pixel & 0x07E0)>>5);
 int16_t blue = (pixel & 0x001F);
 int16_t grayscale = (0.2126 * red) + (0.7152 * green) + (0.0722 * blue);
 *buffer=(grayscale<<11)+(grayscale<<5)+grayscale;

Здесь я ожидал изображения в оттенках серого. Тем не менее, то, что происходит, ->

Зеленый цвет имеет 6 бит пространства (имеет большую величину). Полученное значение в градациях серого должно быть 5 битов, чтобы я соответствовал RG и B. Тем не менее, выполненный расчет обеспечивает 6-битную шкалу серого, из-за которой я не получаю правильное изображение в градациях серого.

Может ли кто-нибудь мне помочьпреобразовать rgb565 в оттенки серого и сохранить его как 16 бит.

1 Ответ

1 голос
/ 18 октября 2019

Компонент Green имеет 6 бит, не потому, что он должен иметь более высокие значения, а потому, что ему нужно более высокое разрешение (см. RGB 565 - Почему 6 бит для зеленого цвета ).

Таким образом, чтобы сделать диапазон значений равным Red и Blue, просто разделите значение Green на 2:

 int16_t pixel = *buffer;
 int16_t red = ((pixel & 0xF800)>>11);
 int16_t green = ((pixel & 0x07E0)>>5);
 int16_t blue = (pixel & 0x001F);
 int16_t grayscale = (0.2126 * red) + (0.7152 * green / 2.0) + (0.0722 * blue);
 //                                                   ^^^^^
 *buffer=(grayscale<<11)+(grayscale<<6)+grayscale;
...