2013-10-04 22 views
10

Podczas konwersji obrazu w OpenCV z koloru na skalę szarości, jaki algorytm konwersji jest używany? Próbowałem sprawdzić to w kodzie źródłowym na GitHub, ale nie odniosłem żadnego sukcesu.Jakiego algorytmu konwersji skali szarości używa OpenCV cvtColor()?

lekkością średnich metoda najbardziej znanych i najmniej znanych kolory:

(max(R, G, B) + min(R, G, B))/2. 

metody średniej prostu uśrednia wartości:

(R + G + B)/3. 

Sposób jasność jest bardziej wyrafinowana wersja metody średniej . Uśrednia również wartości, ale tworzy średnią ważoną, która uwzględnia percepcję człowieka. Jesteśmy bardziej wrażliwi na zielono niż na inne kolory, więc kolor zielony jest najbardziej obciążony.

The formula for luminosity is 0.21 R + 0.72 G + 0.07 B. 

Oto przykład niektóre algorytmy konwersji: http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/

+1

Dlaczego formuła jasność różnić od odniesienia w czynnik G (0,71 vs. 0,72) - jest to literówka czy celowe? – Wolf

Odpowiedz

14

kolor na skali szarości algorytm stwierdzono w cvtColor() documentation. (szukaj RGB2GRAY). Wzór jest taka sama jak dla CCIR 601:

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

Wzór jasność można otrzymano dla R Zaleceniu ITU-BT. 709. Jeśli chcesz, możesz określić CV_RGB2XYZ (np.) W trzecim parametrze na cvtColor(), a następnie wyodrębnić kanał Y.

Możesz pobrać OpenCV, aby wykonać "lekkość", którą opisałeś, wykonując konwersję CV_RGB2HLS, a następnie wyodrębnić kanał L. Nie sądzę, że OpenCV ma konwersję dla "średniej" metody, , ale jeśli zapoznasz się z dokumentacją, zobaczysz, że jest kilka innych możliwości.

0

Chciałem tylko zwrócić uwagę, że:

img = cv2.imread(rgbImageFileName) 
b1 = img[:,:,0] # Gives **Blue** 
b2 = img[:,:,1] # Gives Green 
b3 = img[:,:,2] # Gives **Red** 

Z drugiej strony, ładowanie go jako tablica numeryczna działa dobrze:

imgArray= gdalnumeric.LoadFile(rgbImageFileName) 
Red = imgArray[0, :, :].astype('float32') 
Green = imgArray[1, :, :].astype('float32') 
Blue = imgArray[2, :, :].astype('float32') 

Więc uważaj na tych dziwactw.

Ale po konwersji do skali szarości cv2.cvtColor poprawnie używa pasów. Porównałem wartości pikseli przy użyciu rgb2gray Matlaba.

Cheers