Почему неверна формула Y = 0.3R + 0.59G + 0.11B?

Возьмем известную всем задачу преобразования из цветного в черно-белое изображение. Цель — получить черно-белое изображение, при просмотре которого воспринимаемые яркости пикселей будут пропорциональны воспринимаемой яркости пикселей цветного изображения. Нас интересует не художественный эффект, а фотометрическая точность. Обычно задачу решают либо отбрасыванием одного из трех каналов (получается плохо), либо смешиванием каналов в равных пропорциях (получается лучше, но есть противоречия с экспериментальными результатами). В этот момент обычно на просторах интернета поиском находится формула Y= 0.3R + 0.59G + 0.11B (например, в OpenCV). Но почему коэффициенты именно такие? И верны ли они?

Любое цветовое пространство RGB должно быть связано с эталонным цветовым пространством CIE XYZ. Для CIE XYZ известно соответствие между значением коэффициентов (x,y,z) пикселя и фактическим значением яркости эталонных источников света, смешением которых добиваются получения нужного воспринимаемого цвета. Для каждого RGB-изображения явно или неявно такое преобразование в XYZ должно быть определено, иначе оно может быть корректно показано только на том мониторе, на котором создавалось. Назовем такую информацию цветовым профилем изображения (подробнее здесь и здесь). Если такой профиль есть у монитора, то путем преобразования RGB_{image}rightarrow XYZ_{image} и затем преобразования $ latex XYZ_{image}rightarrow RGB_{display} $ монитора можно получить на другом мониторе цвета, соответствующие исходным (с учетом ограничений цветопередачи).

В пространстве XYZ координата Y по определению соответствует воспринимаемой яркости цвета. Это то, что нам нужно. Чтобы получить из полноцветного изображения монохромное, необходимо преобразовать каждый пиксель в XYZ и взять компоненту Y в качестве результата. Известно, что преобразование между любыми аддитивными цветовыми системами линейное (в силу линейности восприятия цвета человеком). Следовательно, может быть описано матрицей M_{3times 3}, такой, что begin{pmatrix}X\Y\Zend{pmatrix} = M begin{pmatrix}R\G\Bend{pmatrix}

Итак, разгадка. Коэффициенты (0.3,0.59,0.11) — это округленная до второго знака строчка из матрицы преобразования M_{NTSC} из системы NTSC RGB (стандарт для американского телевидения) в XYZ, а “типичная” формула Y= 0.3R + 0.59G + 0.11B вычисляет воспринимаемую яркость Y для изображения, закодированного в NTSC RGB! Полная матрица преобразования выглядит так (взято отсюда):
M_{NTSC}=begin{pmatrix} 0.6068909 && 0.1735011 && 0.2003480 \ 0.2989164 && 0.5865990 && 0.1144845 \ 0.0000000 && 0.0660957 && 1.1162243 end{pmatrix}

Однако подавляющее большинство цифровых изображений на данный момент соответствуют стандарту sRGB, разработанному для компьютерных мониторов, поэтому типичная формула, как правило, неверна!

Для sRGB более корректным будет преобразование (матрицу M для sRGB смотреть здесь):
Y = 0.21R + 0.72G + 0.07B$
Конечно, самым верным будет использование профиля изображения, если он доступен.

Стоит обратить внимание, что sRGB-изображения имеют нелинейную кодировку яркости, так называемую гамма-коррекцию: C_{gamma} = (C_{linear})^{1/gamma}, где gamma является также частью профиля изображения (для sRGB можно считать гамму равной 2.2, хотя в стандарте функция несколько сложнее). Преобразование в черно-белое необходимо проводить в линейном пространстве, поэтому сначала надо выполнить гамма-преобразование, обратное гамма-коррекции C_{linear} = (C_{gamma})^{gamma}. Таким образом, корректное преобразование из цветного sRGB-изображения в монохромное выглядит так (цвета изображения лежат в диапазоне [0,255]):
begin{eqnarray} Y&=&255(0.21r+0.72g+0.07b)^{1/2.2}\ r&=&(R/255)^{2.2}\ g&=&(G/255)^{2.2}\ b&=&(B/255)^{2.2} end{eqnarray}

Сравним результаты применения разных способов преобразования.

  1. Weighed (no gamma!):  Y=1/3R+1/3G+1/3B, гамма-коррекция не применяется
  2. Old school (no gamma!): Y= 0.3R + 0.59G + 0.11B, гамма-коррекция не применяется
  3. Correct (no gamma!): Y = 0.21R + 0.72G + 0.07B
  4. Weighted: аналогично 1), однако примеряется гамма-коррекция
  5. Old school: аналогично 2), однако примеряется гамма-коррекция
  6. Correct: аналогично 3), однако примеряется гамма-коррекция

Как проверить результаты? Если у вас хороший монитор, сравните воспринимаемую яркость предметов на цветном изображении и их яркость на черно-белом. Где более точно передано соотношение? В теории более правильный ответ на изображении от метода Correct.

Все результаты (картинки кликабельны до полного размера):

peppers_resulttoll

Рядом друг с другом:

peppers_result

Разница относительно метода 1) (линейная абсолютная разница times2):

peppers_diffGrayWeightedNoGamma

Обращаю внимание, что для задач, требующих алгоритмической работы с воспринимаемой яркостью (а не вывод на экран), лучше использовать цветовое пространства CIELAB.

Код правильного преобразования с использованием OpenCV:

Mat BGR2Gray(Mat input)
{
  // 8 bit -> 32 bit float
  Mat fltImage;
  input.convertTo(fltImage, CV_32FC3, 1.0 / 255);

  // apply gamma (note: gamma simplified!)
  Mat fltLinear;
  pow(fltImage, 2.2, fltLinear);

  // convert to xyz (keep y) (note: bgr order!)
  Mat bgr2grayCorrent = (Mat_(1, 3) << 0.07, 0.72, 0.21);
  Mat fltGrayCorrect;
  transform(fltLinear, fltGrayCorrect, bgr2grayCorrent);

  // gamma transform
  Mat fltGamma;
  pow(fltGrayCorrect, 1 / 2.2, fltGamma);

  // back 8 bit
  Mat output;
  fltGamma.convertTo(output, CV_8UC3, 255);

  return output;
}

Итак: для преобразования изображения в черно-белое для вывода на экран необходимо использовать преобразование Y = 0.21R + 0.72G + 0.07B и не забывать о гамма-коррекции.

Статья впервые (в сокращенном виде) опубликована в авторской колонке сетевого журнала «Компьютерная графика и мультимедиа» ).

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

На платформе WordPress.com. Тема: Baskerville 2, автор: Anders Noren.

Вверх ↑

%d такие блоггеры, как: