5.30. Porovnávání šablon¶
Detektory probrané doposud odpovídají na otázky o obsahu jednoho snímku: kde jsou bloby, kudy vedou čáry, co říká vytištěný kód. Jiná třída otázek porovnává jeden obraz s druhým. Vypadá tato oblast zachyceného snímku jako referenční výřez, který jsem uložil při kalibraci? Na tuto otázku odpovídají metody porovnávání.
Tonální a statistická analýza představila metodu get_similarity() pro příbuznou otázku – jak moc si jsou tyto dva stejně velké obrazy celkově podobné? – se SSIM jako základní metrikou. Zbývající otázka porovnávání je otázka lokalizace: nikoli „jak moc si jsou tyto dva obrazy podobné“, ale „kde uvnitř tohoto většího obrazu se onen menší výřez objevuje?“ Správným nástrojem pro otázku lokalizace je porovnávání šablon.
5.30.1. Základní volání¶
find_template() hledá první místo, kde se malý obraz šablony objeví uvnitř zachyceného snímku. Implementace používá normalizovanou křížovou korelaci (NCC): šablona se posouvá přes snímek, skóre shody pro každou pozici se počítá z korelace mezi pixely šablony a pixely pod ní ve snímku (normalizováno vůči lokálním průměrům a rozptylům, aby změny zisku porovnávání neoklamaly) a vrátí se první pozice, jejíž skóre překročí threshold, jako ohraničující rámeček:
template = image.Image("/sdcard/template.bmp", copy_to_fb=False)
template.to_grayscale()
match = img.find_template(template, threshold=0.7,
search=image.SEARCH_DS)
if match is not None:
img.draw_rectangle(match, color=(255, 0, 0))
Tato metoda funguje pouze na obrazech ve stupních šedi. Snímejte ve stupních šedi (přirozená volba pro každou kameru bez barevného senzoru) nebo proveďte převod na místě pomocí to_grayscale() před voláním. Totéž platí pro šablonu načtenou z disku: barevná šablona se převede stejnou metodou a výsledek je to, co porovnávač očekává.
threshold je desetinné číslo od 0.0 do 1.0. Hodnota 1.0 vyžaduje dokonalou shodu pixel po pixelu (což se u skutečných zachycených obrazů nikdy nestane), 0.0 přijme cokoli a hodnoty mezi 0.6 a 0.8 pokrývají běžný případ, kdy byla šablona zachycena za podobného osvětlení a scéna se výrazně nezměnila. Práh zvyšte, abyste potlačili falešné pozitivní výsledky; snižte jej, abyste přijali zašuměnější shody za cenu většího počtu falešných zásahů.
5.30.2. Strategie hledání¶
search volí mezi dvěma strategiemi. image.SEARCH_EX je vyčerpávající hledání: šablona se posouvá přes každou pozici po step pixelech ve snímku a vrátí první zásah nad prahem. image.SEARCH_DS je diamantové hledání: porovnávač nejprve vzorkuje hrubě, poté zpřesňuje okolo nejlepšího skóre, což je dramaticky rychlejší, ale může minout skutečnou shodu, pokud hrubý průchod náhodou skončil poblíž lokálního maxima, které poráží to globální. Pro pipeline v reálném čase, kde je šablona dobře definovaná a nepravděpodobně zaměnitelná, je SEARCH_DS správným výchozím nastavením; pro jednorázovou kalibraci, kde je cena minutí vyšší než cena pomalejšího skenu, je SEARCH_EX bezpečnější.
step řídí přeskakování pixelů během vyčerpávajícího průchodu (diamantové hledání si svůj krok spravuje samo). Větší hodnoty step zrychlují sken za cenu subpixelové přesnosti. roi omezuje hledání na oblast snímku, čímž zužuje to, co porovnávač zvažuje, i snižuje množství práce.
Vrácenou hodnotou je n-tice ohraničujícího rámečku (x, y, w, h) identifikující nejlepší shodu, nebo None, pokud žádná pozice nepřekročila práh. Ohraničující rámeček lze přímo předat metodě draw_rectangle() nebo crop() pro další fázi zpracování.
5.30.3. Past měřítka a rotace¶
Klasickým úskalím porovnávání šablon je citlivost na měřítko a rotaci. Porovnávač srovnává šablonu se snímkem pixel po pixelu; šablona zachycená v jedné vzdálenosti neodpovídá témuž objektu zachycenému v jiné vzdálenosti a šablona zachycená čelně neodpovídá témuž objektu pozorovanému mimo osu. Práh tiše klesne pod úroveň shody, i když je objekt pro lidské oko zjevně viditelný, a metoda vrátí None.
Pro jednoduché případy existuje několik řešení. Aplikace může zachytit více šablon v různých měřítkách a spustit find_template() pro každou postupně, přičemž přijme první, která překročí práh; náklady rostou s počtem šablon. Aplikace může před spuštěním porovnávání předzpracovat snímek pomocí rotation_corr() nebo polární transformace (Geometrické transformace), aby odstranila rušivou rotaci; porovnávaná šablona pak stále musí odpovídat opravené geometrii.
Užitečným idiomem pro pipeline kontroly kvality je spárování porovnávače šablon se skórovačem podobnosti, který představila Tonální a statistická analýza: find_template() lokalizuje díl v zachyceném snímku a vrácený ohraničující rámeček se vyřízne a předá metodě get_similarity() k porovnání s referenčním výřezem. Krok porovnání šablony rozhoduje, kde díl je; krok skórování podobnosti rozhoduje, zda je díl přijatelný. Oba kroky běží každý snímek, práh na mean je bránou vyhovuje/nevyhovuje a porovnaný ohraničující rámeček vykreslený zpět do snímku je náhled v IDE, který operátor sleduje.