Преобразование 24-битного изображения RGB в 3-битное 8-цветное

Я могу с помощью BufferedImage получить значения RGB для каждого пикселя изображения 640x640, вывод выглядит следующим образом:

[...]
Pixel :(640, 634) RGB: 166 94 82
Pixel :(640, 635) RGB: 166 94 80
Pixel :(640, 636) RGB: 163 91 77
Pixel :(640, 637) RGB: 157 88 73
Pixel :(640, 638) RGB: 157 88 73
Pixel :(640, 639) RGB: 159 90 74
Pixel :(640, 640) RGB: 158 89 73
This image has 69197 colors.

Мне нужно классифицировать каждый из цветов RGB, полученных таким образом, в 3-битный RGB (8 цветов), мне нужно иметь представление о том, как это сделать... Как узнать диапазон RGB для каждого из 8 цветов 3-битного RGB. Спасибо!


person JF Beaulieu    schedule 18.07.2012    source источник
comment
Эта операция называется дизерингом.   -  person Piotr Praszmo    schedule 18.07.2012


Ответы (2)


Ваше результирующее изображение будет иметь 1 бит для каждого компонента цвета.

Например, для красного цвета вы должны сделать это:

 red1Bit = redOriginal > 127 ? 1 : 0;

Вы должны сделать то же самое для синего и зеленого.

person Hakan Serce    schedule 18.07.2012

24-битная палитра RGB использует 8 бит для каждого из компонентов красного, зеленого и синего цвета:

RGB([0..255], [0..255], [0..255]).

3-битная палитра RGB использует по 1 биту для каждого из компонентов красного, зеленого и синего цвета:

RGB([0..1], [0..1], [0..1]).

Поскольку диапазон каждого канала составляет всего два значения, вам необходимо уменьшить 8-битное кодирование до 1-битного. Для этого разделите на половину максимальное значение в восьмибитной кодировке (255 / 2 = 127)

Вы можете использовать целочисленное деление для преобразования каждого компонента RGB:

3 bit R : (8-bit Red Value) / 127
      G : (8-bit Green Value) / 127 
      B : (8-bit Blue Value) / 127 

Пример:

3 bit R : (56) / 127 = 0
      G : (225) / 127 = 1
      B : (127) / 127 = 1
person Chris Dargis    schedule 18.07.2012