Как преобразовать изображение в оттенки серого? - PullRequest
3 голосов
/ 23 марта 2012

Я хочу сделать точно так же, как показано выше изображение с помощью кода (Android).Но я запутался в алгоритме для этого.Все, что я знаю:

С каждым пикселем:

  1. Конвертировать RGB в HSL

  2. ???

  3. Преобразование HSL обратно в RGB

Может кто-нибудь объяснить мне, что делать на шаге 2?Большое спасибо.

ps: я могу установить насыщенность в андроиде через ColorMatrix.setSaturation (0), но результирующее изображение не совпадает с Photoshop (потому что оттенок и яркость не изменились?)

1 Ответ

10 голосов
/ 23 марта 2012

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

Я обновил этот пост с более подробной информацией.

Средний

Это первое, что может студент сделать изображение, чтобы преобразовать в оттенки серого (по крайней мере, то, что я впервые подумал в прошлом!), И это выглядит как ненасыщенность:

level = (R + G + B) / 3

Это не дает плохого результата, это быстро и легко реализовать. Но у него есть большой недостаток: он не соответствует тому, как люди воспринимают светимость.

Luminance

Этот второй метод (Яркость иногда называют Яркостью, Люмой или Интенсивностью) - лучшая модель того, как наши глаза воспринимают яркость. Это основано на факте, что плотность конуса в глазу не является однородной по цветам. Мы воспринимаем зеленый цвет гораздо сильнее, чем красный, а красный сильнее, чем синий.
Поскольку мы не воспринимаем все цвета с одинаковой интенсивностью, средний метод является неточным (по крайней мере, он не дает результата, который выглядит естественным ). Как это сделать? Просто используйте средневзвешенное значение:

level = R * 0.3 + G * 0.59 + B * 0.11

Как вы можете себе представить, существует множество дискуссий об этих ценностях. В первоначальной рекомендации МСЭ-R предложена эта формула:

level = R * 0.2126 + G * 0.7152 + B * 0.0722

Если я не ошибаюсь, Photoshop использует эту функцию для простой функции десатурации (да, это первая версия без заземления):

level = R * 0.299 + G * 0.587 + B * 0.114

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

Хотите узнать больше? Прочитайте эту статью Чарльза Пойнтона: Восстановление гаммы и его FAQ по этой теме.

Desaturation

Каждый пиксель описан с помощью RGB цветовой модели , но насыщенность относится к HSL цветовой модели (в действительности вы можете использовать модели HSL или HSV, когда работает с насыщением). Пожалуйста, прочитайте ссылку для более подробной информации об этих моделях.

Обесцвечивание изображения состоит из следующих шагов:

  • Конвертируйте каждый пиксель из RGB в HSL (см. эту статью , если вам нужны подробности).
  • Принудительное насыщение до нуля (это должно быть то, что setSaturation(0) делает)
  • Преобразуйте его обратно в RGB (см. Эту закладку ).

Позвольте мне ввести большое уплотнение этого процесса: вы можете обесцветить цвет, находя среднюю точку между максимумом RGB и минимумом RGB (легкость, вы помните, что цвет в Цветовое пространство RGB , это точка в трехмерном пространстве?). (Упрощенная) формула для получения ненасыщенного изображения:

level = (max(R, G, B) + min(R, G, B)) / 2

De-композиционный

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

level = max(R, G, B);

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

Другие методы

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

Иногда учебники Photoshop не используют его функции для обесцвечивания изображения (функция «Обесцвечивание» и палитра «Коррекция»), но для достижения лучших результатов они добавляют слой с однородным цветом (рассчитывается по значениям из раздела Luminance ) и они объединяют этот слой с исходным изображением (найдите учебное пособие и воспроизведите его в коде).

...