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

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

Я думаю, вы имеете в виду оттенки серого. Монохромный означает, что изображение одного оттенка и остается цветным.

golopot 17.06.2017 05:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
19
1
22 439
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

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

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

Перед применением коэффициентов необходимо ЛИНЕЙНИЗИРОВАТЬ значения sRGB, а затем повторно применить гамму.

Myndex 20.06.2019 06:21

Эта статья 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);

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

Jason Sundram 23.11.2011 03:22

Это на самом деле то же самое

user877329 10.12.2015 10:54

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

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

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

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

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

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

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

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

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

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

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

Picture with colours

После преобразования в монохромный с использованием кластеризации k-среднихPicture after converting to monochrome using k-means clustering

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

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

Видео на Youtube, демонстрирующее сегментацию изображений с использованием k-средних?https://thewikihow.com/video_yR7k19YBqiw

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

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

Другие вопросы по теме