Какой алгоритм преобразования оттенков серого использует OpenCV cvtColor ()?

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

метод легкости усредняет самые заметные и наименее заметные цвета:

  (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/

2 ответов


алгоритм цвета в оттенки серого указан в cvtColor() документация. (поиск RGB2GRAY). Используемая формула такая же, как для CCIR 601:

Y = 0,299 R + 0,587 G + 0,114 B

формула светимости, которую вы дали, предназначена для рекомендации ITU-R BT. 709. Если вы хотите, что вы можете указать CV_RGB2XYZ (например) в третьем параметре cvtColor() затем извлеките y-канал.

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


просто хотел отметить, что:

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 использует полосы правильно. Я сравнил значения пикселей с помощью Rgb2gray Matlab.

Ура