Как преобразовать значения RGB пикселя в одно монохромное значение?
Преобразование RGB в монохромный
Ответы (6)
Я нашел одно возможное решение в FAQ по цвету. Компонент яркости Y (из системы CIE XYZ) улавливает то, что люди больше всего воспринимают как цвет, в одном канале. Итак, используйте эти коэффициенты:
mono = (0.2125 * color.r) + (0.7154 * color.g) + (0.0721 * color.b);
В этой статье 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, говорит о том, что преобразование настолько просто или сложно, как вы хотите.
Логика преобразования любого изображения на основе RGB в монохромное изображение - нетривиальное линейное преобразование. На мой взгляд, такую проблему лучше решить с помощью техники «цветовой сегментации». Вы можете добиться «цветовой сегментации» с помощью кластеризации k-средних.
См. Справочный пример с сайта MathWorks.
Исходное изображение в цветах.
После преобразования в монохромный с использованием кластеризации k-средних
Как это работает?
Соберите все значения пикселей со всего изображения. Из изображения шириной W пикселей и высотой H пикселей вы получите значения цвета W * H. Теперь, используя алгоритм k-средних, создайте 2 кластера (или ячеек) и переместите цвета в соответствующие «ячейки». 2 группы представляют ваши черные и белые оттенки.
Видео на YouTube, демонстрирующее сегментацию изображения с использованием k-средних? https://www.youtube.com/watch?v=yR7k19YBqiw
Проблемы с этим методом
Алгоритм кластеризации k-средних чувствителен к выбросам. Несколько случайных пикселей с цветом, расстояние RGB которого далеко от остальной части толпы, могут легко исказить центроиды, что приведет к неожиданным результатам.