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

Какой алгоритм преобразования градаций серого используется 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/

4b9b3361

Ответ 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.

Приветствия