Преобразование RGB в монохромный

Как преобразовать значения RGB пикселя в одно монохромное значение?

Ответов (6)

Решение

Я нашел одно возможное решение в FAQ по цвету . Компонент яркости Y (из системы CIE XYZ ) улавливает то, что больше всего воспринимается людьми как цвет, в одном канале. Итак, используйте эти коэффициенты:

mono = (0.2125 * color.r) + (0.7154 * color.g) + (0.0721 * color.b);

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

Логика преобразования любого изображения на основе RGB в монохромное изображение - нетривиальное линейное преобразование. На мой взгляд, такую ​​проблему лучше решить с помощью техники «цветовой сегментации». Вы можете добиться «цветовой сегментации» с помощью кластеризации k-средних.

См. Справочный пример с сайта MathWorks.

https://www.mathworks.com/examples/image/mw/images-ex71219044-color-based-segmentation-using-k-means-clustering

Оригинальная картинка в цветах.

Картина с цветами

После преобразования в монохромный с использованием кластеризации k-средних Изображение после преобразования в монохромное изображение с использованием кластеризации k-средних

Как это работает?

Соберите все значения пикселей со всего изображения. Из изображения шириной W пикселей и высотой H пикселей вы получите значения цвета W * H. Теперь, используя алгоритм k-means, создайте 2 кластера (или бункера) и поместите цвета в соответствующие «бункеры». 2 группы представляют ваши черные и белые оттенки.

Видео на Youtube, демонстрирующее сегментацию изображения с помощью k-средних? https://www.youtube.com/watch?v=yR7k19YBqiw

Проблемы с этим методом

Алгоритм кластеризации k-средних чувствителен к выбросам. Несколько случайных пикселей с цветом, расстояние RGB которого далеко от остальной части толпы, могут легко исказить центроиды, что приведет к неожиданным результатам.

В этой статье MSDN используется (0.299 * color.R + 0.587 * color.G + 0.114 * color.B);

В этой статье Википедии используется (0.3* color.R + 0.59 * color.G + 0.11 * color.B);

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

Если вы конвертируете цветные фотографии в черно-белые, этот процесс может быть как очень сложным, так и субъективным, требуя определенной настройки для каждого изображения. Чтобы получить представление о том, что может быть задействовано, взгляните на это руководство от Adobe для Photoshop.

Воспроизведение этого в коде было бы довольно сложным и все же потребовало бы вмешательства пользователя для получения конечного изображения эстетически «идеального» (что бы это ни значило!).

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

Например, вы можете обмануть, извлечь только синий компонент, просто отбросив красный и зеленый компоненты и скопировав вместо них синее значение. Еще одно простое и в целом приемлемое решение - взять среднее значение RGB-триплета пикселя и использовать это значение во всех трех компонентах.

Тот факт, что существует значительный рынок профессиональных и не очень дешевых плагинов для преобразования оттенков серого / монохромный только для Photoshop, говорит о том, что преобразование настолько просто или сложно, как вы хотите.