Преобразовать значение оттенков серого в представление RGB?

Как преобразовать значение шкалы серого (0–255) в значение / представление RGB? Он предназначен для использования в изображении SVG, которое, похоже, не имеет поддержки оттенков серого, только RGB ...

Примечание: это не RGB -> оттенки серого, на который уже дан ответ в другом вопросе, например. Преобразование RGB в оттенки серого / интенсивность)


person Rabarberski    schedule 07.05.2009    source источник


Ответы (6)


Быстрый и грязный подход - повторить интенсивность оттенков серого для каждого компонента RGB. Итак, если у вас 120 оттенков серого, он преобразуется в RGB (120, 120, 120).

Это быстро и грязно, потому что эффективная яркость, которую вы получаете, зависит от фактической яркости R, G и B субпикселей устройства, которое вы используете.

person Ates Goral    schedule 07.05.2009

Если у вас есть значение шкалы серого в диапазоне 0..255 и вы хотите создать новое значение в форме 0x00RRGGBB, то быстрый способ сделать это:

int rgb = grey * 0x00010101;

или эквивалент на выбранном вами языке.

person izb    schedule 13.08.2009
comment
+1 для прямого умножения. Инстинкт состоит в том, чтобы погрузиться в битовые сдвиги и побитовые операции ИЛИ, но это намного проще и просто работает. - person Ates Goral; 13.08.2009
comment
Или rgb = grey << 16 | grey << 8 | grey, где << - знаковый оператор сдвига влево, а | - побитовое включающее ИЛИ. - person sp00m; 13.05.2015
comment
Он дает значение вроде 14474460 для значения серого 220. Как мы можем получить из этого значения R, G и B? - person Sagar Gautam; 28.02.2020
comment
14474460 - это значение RGB. 220 - это 0xDC, а 14474460 - 0xDCDCDC. - person izb; 03.03.2020

Преобразование оттенков серого в RGB выполняется просто. Просто используйте R = G = B = серый цвет. Основная идея заключается в том, что цвет (на мониторе с точки зрения RGB) является аддитивной системой.

http://en.wikipedia.org/wiki/Additive_color

Таким образом, добавление красного к зеленому дает желтый цвет. Добавьте в эту смесь в равных количествах немного синего, и вы получите нейтральный цвет. Полное включение [красный, зеленый, синий] = [255 255 255] дает белый цвет. [0,0,0] делает монитор черным. Промежуточные значения, когда все R = G = B равны, дадут номинально нейтральные цвета данного уровня серого.

Небольшая проблема в том, что в зависимости от того, как вы смотрите на цвет, он может быть не совсем нейтральным. Это будет зависеть от того, как откалиброван ваш монитор (или принтер). С этого момента мы можем углубиться в интересные глубины науки о цвете. Я остановлюсь здесь.

person Community    schedule 07.05.2009

Серая шкала означает, что все значения имеют одинаковую интенсивность. Установите для всех каналов (в RGB) значение серого, и вы получите черно-белое изображение в формате RGB.

person Erik    schedule 07.05.2009
comment
Ну нет. На самом деле у вас НЕ будет черно-белого изображения. У вас будет изображение, составленное из различных оттенков серого. На более низком уровне фактические пиксели будут состоять из красных, зеленых и синих точек с такими уровнями интенсивности, что человек, наблюдающий за ними с расстояния, увидит нейтральное изображение. Сделайте петлю на глаз и посмотрите на номинально серые пиксели на вашем мониторе. Вы увидите смесь красных, зеленых и синих точек. - person ; 07.05.2009
comment
Вы правы, что отображаемое изображение на экране будет состоять из всего RGB, смотрящего на увеличение. Так все цвета будут представлены на экране. Мне сложно понять, чем изображение, состоящее из различных оттенков серого, отличается от изображения в градациях серого. - person Erik; 16.05.2009
comment
Эрик, нет, но изображение в градациях серого сильно отличается от черно-белого изображения (которое состоит только из двух цветов). - person Aistina; 13.08.2009
comment
Примечание: черный и белый в разговорной речи означает оттенки серого. - person Stefan Monov; 27.05.2010

Разве нельзя установить для R, G и B одно и то же значение (значение шкалы серого) для каждого пикселя, чтобы получить правильный оттенок серого?

person jlew    schedule 07.05.2009
comment
Не совсем. Это зависит от того, как вы будете рассматривать цвет. Как откалиброван ваш монитор или принтер? В какой среде просмотра вы увидите цвет? ЕСЛИ будет печататься цвет, как калибруется и характеризует ваш принтер? Какие настройки использовались для принтера и каких-либо профилей ICC? Белые точки? Какой источник света используется для просмотра отпечатка? Солнечный лучик? Лампа симулятора D50? Вольфрамовая лампа? Однако с разумной степенью приближения R = G = B = серый цвет - хорошее начало. Это приблизит вас. - person ; 07.05.2009

Вы также можете взглянуть на мое решение Быстрее оптимизированный для сборки способ конвертировать изображение RGB8 в изображение RGB32. Серый канал просто повторяется во всех остальных каналах.

Цель состояла в том, чтобы быстро найти возможное решение для преобразования с использованием x86 / SSE.

person bkausbk    schedule 30.08.2013