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:
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:
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!