Какой алгоритм преобразования градаций серого используется OpenCV cvtColor()?
При преобразовании изображения в OpenCV от цвета в оттенки серого используется какой алгоритм преобразования? Я попытался найти это в исходном коде GitHub, но у меня не было никакого успеха.
Метод lightness усредняет наиболее заметные и наименее яркие цвета:
(max(R, G, B) + min(R, G, B)) / 2.
Средний метод просто усредняет значения:
(R + G + B) / 3.
Метод светимости - более сложная версия среднего метода. Он также усредняет значения, но он формирует средневзвешенное значение для учета человеческого восприятия. Были более чувствительны к зеленому, чем другие цвета, поэтому зеленый вес сильно нагружен.
The formula for luminosity is 0.21 R + 0.72 G + 0.07 B.
Вот пример некоторых алгоритмов преобразования:
http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/
Ответы
Ответ 1
Алгоритм color to grayscale указан в документации cvtColor(). (найдите RGB2GRAY).
Используемая формула такая же, как для CCIR 601:
Y = 0,299 R + 0,587 G + 0,114 B
Формула яркости, которую вы указали, предназначена для Рекомендации МСЭ-R BT. 709. Если вы хотите, чтобы вы указали CV_RGB2XYZ
(например,) в третьем параметре на cvtColor()
, извлеките Y-канал.
Вы можете заставить OpenCV выполнить описанный вами метод "легкости", выполнив преобразование CV_RGB2HLS
, затем извлеките канал L. Я не думаю, что OpenCV имеет преобразование для "среднего" метода,
но если вы изучите документацию, вы увидите, что есть еще несколько возможностей.
Ответ 2
Просто хотел указать, что:
img = cv2.imread(rgbImageFileName)
b1 = img[:,:,0] # Gives **Blue**
b2 = img[:,:,1] # Gives Green
b3 = img[:,:,2] # Gives **Red**
С другой стороны, загрузка его как числового массива прекрасна:
imgArray= gdalnumeric.LoadFile(rgbImageFileName)
Red = imgArray[0, :, :].astype('float32')
Green = imgArray[1, :, :].astype('float32')
Blue = imgArray[2, :, :].astype('float32')
Поэтому просто следите за этими странностями.
Но при преобразовании в оттенки серого cv2.cvtColor правила используются правильно.
Я сравнивал значения пикселей с помощью Matlab rgb2gray.
Приветствия