5.30. Podudaranje predložaka

Detektori obrađeni do sada odgovaraju na pitanja o sadržaju pojedine sličice: gdje se nalaze mrlje, kamo idu linije, što ispisani kod govori. Drugačija vrsta pitanja uspoređuje jednu sliku s drugom. Izgleda li ovo područje uhvaćene sličice poput referentnog isječka koji sam spremio prilikom kalibracije? Metode podudaranja odgovaraju na to pitanje.

Tonska i statistička analiza uvela je get_similarity() za srodno pitanje – koliko su ove dvije slike istih dimenzija sveukupno slične? – s SSIM-om kao temeljnom metrikom. Preostalo pitanje podudaranja jest ono o lokalizaciji: ne „koliko su ove dvije slike slične”, nego „gdje se unutar ove veće slike pojavljuje onaj manji isječak?” Pravi alat za pitanje lokalizacije jest podudaranje predložaka.

5.30.1. Osnovni poziv

find_template() traži prvo mjesto na kojem se mala slika predloška pojavljuje unutar uhvaćene sličice. Implementacija koristi normaliziranu unakrsnu korelaciju (NCC): predložak klizi preko sličice, ocjena podudaranja po pojedinom položaju izračunava se iz korelacije između piksela predloška i pripadajućih piksela sličice (normalizirano u odnosu na lokalne srednje vrijednosti i varijance kako promjene pojačanja ne bi zavarale podudaranje), a prvi položaj čija ocjena premaši threshold vraća se kao granični okvir:

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))

Metoda radi samo na slikama u sivim tonovima. Snimajte u sivim tonovima (prirodan izbor za svaku kameru bez senzora za boju) ili pretvorite na mjestu pomoću to_grayscale() prije poziva. Isto vrijedi i za predložak učitan s diska: predložak u boji pretvara se istom metodom, a rezultat je ono što podudaratelj očekuje.

threshold je realni broj od 0.0 do 1.0. Vrijednost 1.0 zahtijeva savršeno podudaranje piksel po piksel (što se sa stvarnim uhvaćenim slikama nikad ne događa), 0.0 prihvaća bilo što, a vrijednosti između 0.6 i 0.8 pokrivaju uobičajeni slučaj u kojem je predložak snimljen pod sličnim osvjetljenjem i scena se nije dramatično promijenila. Povisite prag kako biste suzbili lažno pozitivne rezultate; snizite ga kako biste prihvatili šumovitija podudaranja po cijenu većeg broja lažnih pogodaka.

5.30.2. Strategija pretraživanja

search bira između dviju strategija. image.SEARCH_EX je iscrpno pretraživanje: predložak klizi kroz svaki položaj na razmaku od step piksela u sličici i vraća prvi pogodak iznad praga. image.SEARCH_DS je dijamantno pretraživanje: podudaratelj najprije uzorkuje grubo, a zatim profinjuje oko najbolje ocjene, što je dramatično brže, ali može propustiti istinsko podudaranje ako je grubi prolaz slučajno završio blizu lokalnog maksimuma koji nadmašuje globalni. Za cjevovod u stvarnom vremenu gdje je predložak dobro definiran i malo je vjerojatno da će biti zamijenjen, SEARCH_DS je pravi zadani izbor; za jednokratnu kalibraciju gdje je cijena promašaja viša od cijene sporijeg skeniranja, SEARCH_EX je sigurniji.

step upravlja preskakanjem piksela tijekom iscrpnog prolaza (dijamantno pretraživanje upravlja vlastitim korakom). Veće vrijednosti step ubrzavaju skeniranje po cijenu podpikselne preciznosti. roi ograničava pretraživanje na područje sličice, čime se istovremeno sužava ono što podudaratelj razmatra i smanjuje količina posla.

Vraćena vrijednost je n-torka graničnog okvira (x, y, w, h) koja identificira najbolje podudaranje ili None ako nijedan položaj nije premašio prag. Granični okvir izravno se uklapa u draw_rectangle() ili crop() za sljedeću fazu obrade.

5.30.3. Zamka skaliranja i rotacije

Klasična zamka pri podudaranju predložaka jest osjetljivost na skaliranje i rotaciju. Podudaratelj uspoređuje predložak sa sličicom piksel po piksel; predložak snimljen na jednoj udaljenosti ne podudara se s istim objektom snimljenim na drugoj udaljenosti, a predložak snimljen ravno sprijeda ne podudara se s istim objektom gledanim pod kutom. Ocjena tiho pada ispod razine podudaranja čak i kad je objekt ljudskom oku jasno vidljiv, te metoda vraća None.

Postoji nekoliko zaobilaznih rješenja za jednostavne slučajeve. Aplikacija može snimiti više predložaka na različitim mjerilima i izvršiti find_template() za svaki redom, prihvaćajući prvi koji premaši prag; cijena raste s brojem predložaka. Aplikacija može unaprijed obraditi sličicu pomoću rotation_corr() ili polarne transformacije (Geometrijske transformacije) kako bi uklonila problematičnu rotaciju prije pokretanja podudaranja; podudareni predložak i dalje se mora podudarati s ispravljenom geometrijom.

Koristan obrazac za cjevovode kontrole kvalitete (QA inspekcija) uparuje podudaratelj predložaka s ocjenjivačem sličnosti koji je uvela Tonska i statistička analiza: find_template() locira dio u uhvaćenoj sličici, a vraćeni granični okvir se izrezuje i prosljeđuje metodi get_similarity() u usporedbi s referentnim isječkom. Korak podudaranja predloška odlučuje gdje je dio; korak ocjenjivanja sličnosti odlučuje je li dio prihvatljiv. Oba koraka izvršavaju se na svakoj sličici, prag na mean je odlučujuća točka prolaza/pada, a podudareni granični okvir nacrtan natrag u sličicu jest pregled u IDE-u koji operater promatra.