Как конвертировать RGB565 в HSL Color в C - PullRequest
1 голос
/ 24 июня 2019

Я новичок в преобразовании типов изображений. Я хотел бы определить цвет каждого пикселя на экране. Я могу прочитать цвета из буфера кадров, но все они в RGB565. Для отслеживания определенного цвета я хотел бы преобразовать RGB565 в HSV, чтобы я мог проверить оттенок.

Я уже пытался преобразовать его через онлайн-конвертер из RGB565 в RGB888. Например, от RGB565 '08F5' до RGB888 '081BAA'. А затем с RGB888 до HSL «233 91% 35%». Тем не менее, я не могу заставить это работать с кодом C. Цвета в формате HEX и сохраняются в 2 в одном регистре. Я сделал массив из четырех символов для каждого цвета.

int colorcodes = IORD_ALTERA_AVALON_PIO_DATA(0x08000000 + 123204);
char colorcodesInHex[9];
snprintf(colorcodesInHex, 9, "%08x\n", colorcodes);

char firstColor[4];
char secondColor[4];

for(int i = 0; i <= 7; i++)
{
    if(i <= 3)
    {
        firstColor[i] = colorcodesInHex[i];
    }
    else if (i >= 4 && i <= 7)
    {
        secondColor[i - 4] = colorcodesInHex[i];
    }
}

Кто-нибудь знает, как преобразовать RGB565 в RGB888, а затем в HSL в C?

1 Ответ

0 голосов
/ 24 июня 2019
  int rgb565 = ...; // 16 bit value with rrrrrggggggbbbbb

  double r = ((rgb565 >> 11) & 0x1F) / 31.0; // red   0.0 .. 1.0
  double g = ((rgb565 >> 5) & 0x3F) / 63.0;  // green 0.0 .. 1.0
  double b = (rgb565 & 0x1F) / 31.0;         // blue  0.0 .. 1.0

  double cmax = max(r, max(g, b));
  double cmin = min(r, min(g, b));
  double delta = cmax - cmin;

  // hue (in °)
  double h_degrees = delta == 0.0 ? 0.0
                     : cmax == r ? 60 * (((g - b) / delta) % 6)
                     : cmax == g ? 60 * (((b - r) / delta + 2)
                     : /* cmax == b ? */ 60 * (((r - g) / delta + 4);

  // saturation
  double s = delta == 0.0 ? 0.0 : delta / (1.0 - abs(cmax + cmin - 1));

  // lightness
  double l = (cmax + cmin)/2;

RGB565 представляет собой 16 упаковок красно-зелено-синего цвета.Выше приведено преобразование RGB565 в HSL.

с оттенком в градусах от 0 ° до 360 °

  • красный / зеленый / синий компонентыизвлекается со сдвигом битов >>, а затем масштабируется до 0,0 - 1,0.

  • Полученный lightness является несовершенным средним значением, а именно средним из минимального и максимального цветового компонентазначение.

  • Цветовой оттенок - это угол в цветовом круге, разделенный на три цвета RGB.

  • Насыщенность, тенденция серого, как определено, определяется меньшим дельта.

...