5.2. Souřadnice a oblasti¶
Zpracování obrazu pracuje s pixely, a aby algoritmus mohl s pixelem pracovat, musí jej adresovat pomocí souřadnice. Pro práci s jejich obdélníkem platí totéž – obdélník musí být popsán způsobem, na kterém se algoritmus a kód aplikace shodnou. Konvence, kterou modul image používá pro souřadnice a obdélníky, je přímočará, s jedním detailem, který zaskočí čtenáře zvyklé spíše na matematickou konvenci než na konvenci počítačové grafiky, a ten stojí za to hned na začátku jasně vysvětlit.
5.2.1. Mřížka pixelů¶
Pixel (0, 0) je levý horní roh obrazu. Osa x běží doprava, takže větší x znamená dále vpravo. Osa y běží dolů, takže větší y znamená dále dolů v obraze. Obraz o rozměrech šířka krát výška obsahuje pixely na celočíselných souřadnicích od (0, 0) po (width - 1, height - 1); na pozici (width, 0) ani (0, height) žádný pixel není – tyto pozice jsou pravý a dolní okraj, o jeden krok za posledním skutečným pixelem v každém směru.
Osa y směřující dolů je oním detailem zmíněným výše. Čtenář zvyklý na geometrii na čtverečkovaném papíře očekává, že větší y znamená výše; zde je tato intuice přesně obrácená. Důvodem obrácení je, že digitální senzory i digitální displeje pracují od levého horního rohu a procházejí každý řádek směrem doprava, shora dolů, a uložení pixelů v paměti ve stejném pořadí činí vztah mezi „pozicí i v bufferu“ a „řádkem r, sloupcem c obrazu“ tak jednoduchou aritmetikou, jak jen to jde – pozice i pixelu (x, y) je prostě y * width + x. Každá knihovna pro práci s obrazem se na tomto uspořádání shodla už před desetiletími ze stejného důvodu a cenou za to je jen jedna drobná myšlenková úprava při prvním zacházení s obrazy.
Souřadnicový systém obrazu: počátek v levém horním rohu, x běží doprava, y běží dolů. Obdélníková oblast uvnitř obrazu je pojmenována svým levým horním rohem (x, y) a svými rozměry (w, h).¶
5.2.2. Obdélníky¶
Většině operací s obrazem jde méně o jediný pixel než o obdélník pixelů – oblast, ve které se hledá, oblast ke zkopírování, snímek uvnitř snímku, nad nímž se počítají statistiky. Forma pro pojmenování obdélníku volí nejjednodušší možné rozšíření konvence pro jediný pixel: zadejte souřadnici levého horního rohu, následovanou rozměry obdélníku, zabalené do čtveřice (x, y, w, h). Pixely uvnitř obdélníku jsou ve sloupcích x až x + w - 1 a řádcích y až y + h - 1.
Detail, který zde stojí za jasné vysvětlení, je, že w a h jsou velikosti, nikoli souřadnice pravého dolního rohu. Obdélník (10, 20, 4, 3) pokrývá sloupce 10, 11, 12, 13 a řádky 20, 21, 22 – celkem dvanáct pixelů – nikoli oblast táhnoucí se od (10, 20) do (4, 3). Konvence je v celém modulu jednotná, takže jakmile se zažije, omyly přestanou, ale napoprvé lidi zaskočí.
Forma (x, y, w, h) se objevuje na třech místech, která vypadají odlišně, ale sdílejí tutéž konvenci. První je, když obraz popisuje svůj vlastní rozsah: obdélník pokrývající celý obraz je (0, 0, width, height). Druhé je, když detekční metoda vrací výsledek s ohraničujícím rámečkem – blob, rect, apriltag – a rámeček je hlášen zpět jako (x, y, w, h). Třetí je, když je třeba metodě sdělit, aby pracovala s podoblastí obrazu spíše než s celým snímkem; klíčový argument roi, který vymezuje rozsah operace, přijímá tutéž čtveřici.
Převzít ohraničující rámeček z jedné metody a vložit jej do argumentu roi další metody je jeden z nejběžnějších vzorů ve zpracování obrazu. Ohraničující rámeček hrubé první detekce zúží oblast hledání pro jemnější druhou detekci a právě jednotný slovník napříč výsledky detekce a argumenty metod je tím, co tento vzor činí tak přímočarým – jedna forma čtveřice, použitá stejným způsobem na obou stranách předání.
5.2.3. Celočíselné adresy, zlomkové těžiště¶
Adresy pixelů samy o sobě jsou celá čísla. Pixel buď na daném celočíselném sloupci a řádku je, nebo není, a ptát se, co je na souřadnici (40.5, 30.7), není dobře položená otázka – na přesně té pozici žádný pixel nesedí. Hrstka veličin, které modul image z pozic pixelů odvozuje, je však zlomková, a stojí za to pochopit proč, aby tento rozdíl aplikaci později nezaskočil.
Nejběžnějším případem je těžiště – střed hmotnosti oblasti. Pro souvislou oblast pixelů je těžiště v plovoucí řádové čárce průměrem pozic členských pixelů, vážený jejich hustotou. Oblast, jejíž pixely zasahují do dvou sloupců, bude mít těžiště x například 41.6 – skutečnou pozici, kterou by oko popsalo jako „střed té oblasti“, přestože na přesně tom x žádný skutečný pixel nesedí. Objekty výsledků detekce nesou obě formy jako vlastnosti pouze pro čtení: celočíselnou dvojici (cx / cy, užitečnou při zpětném předání pozice něčemu, co chce celočíselné souřadnice pixelů) a dvojici v plovoucí řádové čárce (cxf / cyf, užitečnou, když pozice směřuje do řídicí smyčky, která těží ze subpixelového rozlišení).
Druhým případem je posunutí mezi dvěma snímky měřené ve frekvenční oblasti. Techniky, které analyzují spektrální obsah obrazu spíše než přímo jeho pixely, dokážou rozlišit posuny jemnější než jeden pixel a hlásí tyto posuny jako hodnoty (dx, dy) v plovoucí řádové čárce.
Praktické pravidlo: adresy pixelů jsou celá čísla; pozice a posuny, které z algoritmu vycházejí, mohou být desetinná čísla. Metody pro kreslení přijímají obě formy a desetinná čísla zaokrouhlují dolů na nejbližší celočíselný pixel, když výsledek musí dopadnout na mřížku.
5.2.4. Kartézské a polární¶
Systém popsaný dosud je kartézský: každý pixel je pojmenován svým horizontálním a vertikálním posunem od počátku. To je systém, ve kterém jsou bajty uloženy – pixel i v bufferu odpovídá pixelu ve sloupci i % width a řádku i // width, procházejíc řádky odshora – a je to systém, ve kterém ve výchozím nastavení pracuje každá metoda.
Druhé znázornění stojí za to znát, protože některé algoritmy v něm fungují mnohem lépe. Polární souřadnice pojmenovávají každý pixel jeho vzdáleností od zvoleného středového bodu a úhlem mezi ním a referenčním směrem. Pixely obrazu se nepohnuly – bajty jsou stále ve stejném bufferu uspořádaném po řádcích – ale schéma adresování se přepnulo z „jak daleko vpravo a jak daleko dolů“ na „jak daleko od středu a pod jakým úhlem kolem něj.“
Tentýž bod P, pojmenovaný dvěma způsoby: kartézsky (x, y) od počátku v levém horním rohu, polárně (r, theta) od zvoleného středu.¶
Proč se vůbec přepínat? Kvůli dvěma identitám, které mění obtížná hledání na snadná.
V polárních souřadnicích je otáčení obrazu kolem zvoleného středu touž operací jako posun jeho pixelů podél osy úhlu – směru x v přemapovaném obraze. Pootočená kopie je originál posunutý doleva nebo doprava v polární formě.
V log-polární variantě – osa vzdálenosti používá logaritmické měřítko, osa úhlu zůstává lineární – je škálování obrazu kolem zvoleného středu touž operací jako posun jeho pixelů podél osy vzdálenosti – směru y. Zvětšená nebo zmenšená kopie je originál posunutý nahoru nebo dolů v log-polární formě.
Algoritmus, který musí rozpoznat známý vzor při otočení nebo škálování, tak může své hledání provádět v polárním prostoru, kde se obě transformace mění na běžné posuny. Posuny se hledají mnohem levněji než otočení a škálování, a právě polární přemapování tuto záměnu umožňuje.
Polární souřadnice nenahrazují kartézské pro ukládání pixelů; bajty vždy leží na kartézské mřížce. Modul poskytuje dvojici metod, které na vyžádání přemapují obraz z kartézské do polární formy, algoritmus, který polární souřadnice potřebuje, vykoná svou práci, a buď se výsledek promítne zpět ven, nebo se měření v polárním prostoru použije přímo. Tento mechanismus je jediným důvodem, proč se polární souřadnice kdekoli v rozhraní modulu objevují.
S kartézskými souřadnicemi pro pojmenování jednotlivých pixelů, čtveřicí (x, y, w, h) pro pojmenování jejich obdélníků a polárními souřadnicemi dostupnými, když z nich algoritmus těží, má aplikace kompletní slovník pro pojmenování, kde v obraze něco je. Co je na kterékoli z těchto pozic skutečně uloženo, je další vrstva základu.