Почему серая шкала работает так, как она работает?
Мой оригинальный вопрос
Я прочитал, что для преобразования RGB-пикселя в RGB с серой шкалой следует использовать
r_new = g_new = b_new = r_old * 0.3 + g_old * 0.59 + b_old * 0.11
Я также читаю и понимаю, что g
имеет более высокий вес, потому что человеческий глаз более чувствителен к зеленому. Реализовав это, я увидел, что результаты были такими же, как и при настройке изображения на "оттенки серого" в редакторе изображений, таком как Gimp.
Прежде чем я прочитал это, я представил себе, что для преобразования пикселя в оттенки серого можно преобразовать его в HSL или HSV, а затем установить насыщенность в ноль (следовательно, удалить весь цвет). Однако, когда я это сделал, у меня получилось совсем другое изображение, хотя у него также не было цвета.
Как s = 0
точно отличается от "правильного" способа, который я читаю, и почему он "неверен"?
Текущие результаты, основанные на ответах и других исследованиях
Похоже, что используемые коэффициенты яркости являются предметом некоторых дебатов. Различные комбинации и алгоритмы greyscale имеют разные результаты. Ниже приведены некоторые пресеты, используемые в таких областях, как телевизионные стандарты:
- коэффициенты, определенные ITU-R BT.601 (NTSC?), равны
0.299r + 0.587g + 0.114b
- коэффициенты, определенные ITU-R BT.709 (новее),
0.2126r + 0.7152g + 0.0722b
- коэффициенты равной трети,
(1/3)(rgb)
, эквивалентны s = 0
Эта научная статья описывает различные методы оттенков серого и их результаты для различных изображений, плюс субъективный опрос 119 человек.
Однако при преобразовании изображения в оттенки серого для достижения "наилучшего" художественного эффекта почти наверняка не будет использовать эти предопределенные коэффициенты, а можно настроить вклад каждого канала для получения наилучшего результата для конкретного изображения.
Ответы
Ответ 1
Хотя эти коэффициенты трансформации существуют, ничто не связывает вас с их использованием. Пока общая интенсивность каждого пикселя не изменяется, вклад от каждого канала может составлять от 0 до 100%.
Фотографы, преобразующие изображения в оттенки серого, используют канальные микшеры для настройки уровней каждого канала (RGB или CMYK). На вашем изображении много красных и зеленых, поэтому может быть желательно (в зависимости от вашего намерения), чтобы эти каналы были более представлены в интенсивности серого, чем синий.
Это то, что отличает "научную" трансформацию изображения от "художественной" комбинации полос.
Дополнительным соображением является динамический диапазон значений в каждой полосе и попытка сохранить их в изображении в градациях серого. Например, увеличение теней и/или бликов может потребовать увеличения вклада синей полосы.
Ответ 2
Интересная статья по этой теме здесь... "потому что человеческие глаза не определяют яркость линейно с цветом".
http://www.scantips.com/lumin.html
Ответ 3
Похоже, что эти коэффициенты исходят из старой технологии CRT и плохо адаптированы к сегодняшним мониторам, из Цветные часто задаваемые вопросы:
Коэффициенты 0.299, 0.587 и 0.114 правильно рассчитанная яркость для мониторов с люминофорами, которые были современности при введении NTSC в 1953 году. Они все еще подходящий для вычисления видео яркость, которая будет обсуждаться ниже в разделе 11. Однако эти коэффициенты не точно вычисляют яркость для современные мониторы.
Не удалось найти правильный коэффициент преобразования.
См. также RGB для монохромного преобразования
Ответ 4
Используя s = 0
в HSL/HSV и преобразование в результаты RGB в R = G = B
, то же самое, что и при выполнении r_old * 1/3 + g_old * 1/3 + b_old * 1/3
.
Чтобы понять, почему, посмотрите страницу Wikipedia, в которой описывается преобразование HSV- > RGB. Насыщенность s
будет равна 0, поэтому C
и X
тоже будет. В итоге вы получите R_1,G_1,B_1
(0,0,0)
, а затем добавьте m
к окончательным значениям RGB, что приведет к (m,m,m)
= (V,V,V)
. То же самое для HSL, результат будет (m,m,m)
= (L,L,L
).
РЕДАКТ: ОК, только что выяснилось, это не полный ответ, хотя это хорошая отправная точка. Значения RGB будут одинаковыми: либо L
, либо V
, но все равно зависит от того, как изначально были рассчитаны L
и V
, см. Wikipedia. Кажется, программа/формулы, которые вы использовали для преобразования, использовали решение 1/3 * R + 1/3 * G + 1/3 * B
или один из двух других (hexcone/bi-hexcone).
В конце концов, использование HSL/HSV просто означает, что вам нужно будет решить, какая формула использовать раньше, а преобразование в значения оттенков серого RGB позже просто изолирует последний компонент.