5.14. Netezire gaussiană și muchii

Două sarcini domină utilizarea ferestrelor de vecinătate în viziunea artificială clasică: netezirea curată a variațiilor de la pixel la pixel și găsirea muchiilor unde imaginea se schimbă brusc. Filtrul gaussian este instrumentul standard pentru prima, iar detectoarele bazate pe Laplacian instrumentul standard pentru a doua – și cele două se combină, deoarece orice detector de muchii funcționează mai bine pe o intrare ușor netezită.

5.14.1. Filtrul gaussian

gaussian() este verișorul ponderat spre centru al lui mean(). Ambele calculează o medie peste vecinătatea fiecărui pixel, dar ponderile gaussianului nu sunt uniforme: pixelii mai apropiați de centrul vecinătății contează mai mult, pixelii de la marginea vecinătății contează mai puțin, ponderile urmând familiara curbă în formă de clopot care îi dă filtrului numele.

Ponderarea în formă de clopot este cea care face un filtru gaussian mai neted decât o medie de tip box. Filtrarea cu media poate produce artefacte vizibile la marginile obiectelor – o tăiere bruscă a ponderării introduce mici modele de oscilație la tranziții abrupte. Ponderile gaussianului, care scad lin, evită acea oscilație și produc un rezultat care arată mai aproape de ceea ce ar trebui să însemne „neclar”. Costul este o calculare mai mare pe pixel decât la filtrul de medie, dar nu dramatic mai mare – costul pe pixel rămâne mult mai mic decât la filtrul bilateral.

img.gaussian(1)    # 3x3 Gaussian -- a clean light blur
img.gaussian(2)    # 5x5 Gaussian -- stronger smoothing

Netezirea gaussiană este prima etapă standard a aproape oricărui flux de detectare a muchiilor. Detectoarele de muchii de mai jos amplifică toate conținutul de frecvență înaltă, inclusiv zgomotul senzorului pe care algoritmul nu vrea de fapt să-l detecteze. Rularea în prealabil a unui gaussian ușor suprimă acel zgomot fără a înmuia prea mult muchiile reale, lăsând detectorul de muchii să găsească muchii reale în loc de zgomot punctiform.

5.14.2. Mascare prin neclaritate (unsharp masking)

O copie a unei imagini neclarizate gaussian este materia primă pe care o folosește tehnica unsharp mask pentru accentuarea clasică. Setarea unsharp=True pe filtru îl comută de la „produce imaginea neclarizată” la „scade imaginea neclarizată din original și adaugă diferența înapoi la original” – efectul este că muchiile de frecvență înaltă sunt amplificate în raport cu interioarele netede.

img.gaussian(1, unsharp=True)

Parametrii opționali mul și add scalează intensitatea rezultatului unsharp; valorile implicite (mul=1.0, add=0.0) reprezintă o accentuare moderată care nu exagerează zgomotul senzorului.

5.14.3. Filtrul Laplacian

laplacian() rulează o aproximare discretă a derivatei spațiale de ordinul doi a imaginii. Ieșirea este mare acolo unde valorile pixelilor se schimbă rapid și aproape de zero acolo unde sunt constante sau se schimbă liniar. Interpretarea naturală a rezultatului este un răspuns la muchii: pixelii unde imaginea se schimbă rapid se aprind, pixelii din interioarele netede rămân întunecați.

img.laplacian(1)   # 3x3 Laplacian -- edge response

Sunt disponibili aceiași parametri ca la gaussian. sharpen=True produce o imagine accentuată (Laplacianul adăugat înapoi în original, în loc să fie returnat de unul singur). mul și add scalează răspunsul.

O utilizare practică dincolo de detectarea muchiilor este măsurarea focalizării. Răspunsul Laplacianului mediat peste o regiune oferă o măsură aproximativă a cantității de conținut de frecvență înaltă pe care o poartă regiunea; pe un cadru bine focalizat această medie este mare, pe un cadru neclar scade. Compararea răspunsului Laplacianului între cadre este modalitatea ieftină de a întreba „este obiectivul focalizat?” fără a avea nevoie de o metrică de contrast mai costisitoare.

5.14.4. Metoda find_edges

find_edges() rulează un flux complet de detectare a muchiilor, nu doar un filtru de răspuns la muchii. Funcționează pe imagini în tonuri de gri, iar rezultatul este o imagine binară ai cărei pixeli diferiți de zero marchează pozițiile unde intrarea are tipul de schimbare de luminozitate care ar trebui să conteze ca muchie.

Metoda acceptă un parametru edge_type care alege între doi algoritmi:

EDGE_SIMPLE rulează un filtru trece-sus, aplică un prag și returnează rezultatul. Rapid, dar ieșirea include fiecare schimbare de luminozitate peste prag, inclusiv zgomotul și textura de care aplicația probabil nu îi pasă. Rezonabil pentru imagini curate și pentru cazurile în care zgomotul urmează să fie curățat de o trecere morfologică ulterioară.

EDGE_CANNY rulează detectorul de muchii Canny – algoritmul clasic în mai multe etape. Acesta calculează gradientul de luminozitate, suprimă fiecare răspuns care nu este maxim de-a lungul direcției gradientului (astfel încât fiecare muchie are lățimea de un pixel) și aplică un prag cu histerezis (astfel încât o muchie puternică într-un loc este urmărită chiar și acolo unde se estompează între capete). Rezultatul este un set curat, subțire și conectat de pixeli de muchie, de tipul pe care îl dorește orice algoritm clasic bazat pe muchii.

Parametrul threshold este un tuplu cu două elemente (low, high). Pentru EDGE_CANNY, valoarea high este pragul de tăiere peste care un pixel este cu siguranță o muchie, iar valoarea low este pragul de tăiere peste care un pixel este o muchie doar dacă este conectat la una certă. Pentru EDGE_SIMPLE, contează doar valoarea high; este pragul unic de tăiere peste care un pixel contează ca muchie. Valoarea implicită (100, 200) este un punct de plecare care merită reglat pentru scena specifică.

img.gaussian(1)                                   # pre-smooth
img.find_edges(image.EDGE_CANNY, threshold=(50, 100))

Detectorul Canny este alegerea mai bună pentru aproape orice aplicație în care muchiile contează. Cel mai rapid EDGE_SIMPLE merită reținut pentru cazurile în care costul lui Canny este o problemă, iar respingerea zgomotului prin histerezisul său nu este de fapt necesară.

5.14.5. Pragul adaptiv pe gaussian

La fel ca filtrele statistice, gaussian() acceptă perechea de cuvinte-cheie threshold=True / offset=N pentru pragul adaptiv. Comportamentul este același ca la mean(): statistica gaussiană din fiecare poziție devine pragul de tăiere local, iar pixelul sursă este comparat cu statistica plus offsetul pentru a produce un rezultat binar.

Varianta gaussiană este de obicei cea mai curată alegere pentru pragul adaptiv atunci când intrarea este rezonabil de lipsită de zgomot. Media ponderată oferă un prag de tăiere mai neted decât produce filtrul de medie, cu mai puține artefacte la tranzițiile abrupte de iluminare.