Odwracanie kanałów BGR do RGB w numpy

Posiadając obraz zapisany w postaci macierzowej czasem, ze względu na kompatybilność bibliotek musimy dokonać odwrócenia kanałów kolorów.

Mając o kształcie (shape): (150, 100, 3), ostatni wymiar(z wartościa 3) oznacza kanały. Aby odwrócić kolejność kanałów używając biblioteki numpy wystarczy napisać:

img = img[...,::-1]

Dzieje się tu kilka magicznych rzeczy dostępnych w składni Pythona, którym przyjrzymy się bliżej.

...

Owe magiczne "trzy kropki" oznaczają dokładnie "wcześniejsze kanały zostają jak były".  Sam zapis [... , ::-1] jawnie definiuje co dzieje się na ostatnim kanale, z czego wcześniejsze pozostają niezmienne. Dlatego zapis ten dla zdjęcia (o trzech wymiarach) tożsamy jest z:

img = img[:,:,::-1]

Przedziały

Ok... ale co oznaczają te dwukropki ?

Dla każdego wymiaru zdefiniować można przedział wartości, z którego bierzemy dane. Przykładowo:

Definicja zakresu przedziału

tutaj widać wektor z 6-cioma wartościami, a przedział "2:4" oznacza, że brane są wartości od indeksu 2 (włącznie) do indeksu 4 (wyłącznie).

Kiedy nie podamy tych warości (":" zamiast "2:4") oznacza to, że wzięte będą wszystkie elementy:

Przedział pełny

tak więc dla obrazu o oryginalnej wysokości 150 i szerokości 100 zapis tożsamy jest z.

img = img[0:150,0:100,::-1]

Iterator

Obok przedziału wystąpić może jeszcze jeden element : krok. Jest to wartość opisująca "co który element ma być wzięty". Przykładowo:

::2 bierze co drugi element.

Kolejnym trickiem są tutaj wartości ujemne. Wartość poniżej zera oznacza, że elementy mają być brane w odwrotnej kolejności:

Każdy z kanałów może mieć określony własny krok. I to właściwie kończy zagadkę - dla trzeciego kanału bierzemy wszystkie wartości w odwrotnej kolejności.

Tak, wiem... magia!