2013-10-04 1 views
10

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

светлоты средних метод наиболее известных и наименее известных цветов:

(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

Почему ваша светимость формула отличается от вашей ссылки в фактор G (0,71 против 0,72) - это опечатка или намеренно? – Wolf

ответ

14

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

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

Формула светимость вы дали для Рекомендации МСЭ-R BT. 709. Если вы хотите, чтобы вы могли указать CV_RGB2XYZ (например,) в третьем параметре до cvtColor(), тогда извлеките Y-канал.

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

0

Просто хотелось бы отметить, что:

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.

Приветствия