Преобразование между 24-битным цветом RGB и 8-битным цветом

Я пытаюсь преобразовать 24-битные (8R, 8G, 8B) в 8-битные (RRRGGGBB) цвета.

Я понимаю основную концепцию масштабирования цветовых байтов и сложения их вместе (после сдвига). то есть, учитывая RGB (255 254 253), я бы взял 255/32 * 32 + 254/32 * 4 + 253/64, и это дало бы мне 111 111,11b (белый).

Это работает очень хорошо для изображений с большим количеством красного и зеленого, но как только начинает появляться синий цвет, все становится совсем не так. Синий цвет начинает выглядеть более бирюзовым или фиолетовым, чем раньше.

Я не пытаюсь делать дизеринг, а скорее пытаюсь найти лучшее сопоставление между RGB и 8 битами.

Я думал о преобразовании RGB в HSV, а затем в 8-битный, но я также не уверен, как преобразовать из HSV в 8-битный, байт H не соответствует RRRGGGBB. Даже если бы это было так, я не мог бы получить черно-белое изображение. Есть ли способ взвесить байты H, S, V (например, как я сделал с RGB), чтобы получить то, что я хочу? Или я должен просто найти лучшее отображение между RGB прямо в 8 бит?


person Vbomm    schedule 01.03.2016    source источник
comment
Собираетесь ли вы использовать определенный язык, поскольку он может уже предоставлять вам необходимые операции?   -  person Andre M    schedule 02.03.2016
comment
На ассемблере написано   -  person Vbomm    schedule 02.03.2016
comment
Имея только 2 бита информации для синего канала, не ожидайте, что цвета будут выглядеть правильно. У вас все отлично, намного лучшего преобразования в RRRGGGBB не будет, если не дизерить. Изображение с 8-битной палитрой может выглядеть намного лучше   -  person galinette    schedule 02.03.2016


Ответы (1)


Чтобы преобразовать 8-битное [0 - 255] значение в 3-битное [0, 7], 0 не проблема, но помните, что 255 нужно преобразовать в 7, поэтому формула должна быть Red3 = Red8 * 7/255.

Чтобы преобразовать 24-битный цвет в 8-битный,

8bit Color = (Red8 * 7 / 255) << 5 + (Green8 * 7 / 255) << 2 + (Blue8 * 3 / 255)
person Mingjie Li    schedule 17.06.2016