Canny Edge Detector folosind Python

Detecția marginilor este o tehnică esențială de analiză a imaginii atunci când cineva este interesat să recunoască obiectele prin contururile lor și este, de asemenea, considerat un pas esențial în recuperarea informațiilor din imagini. 

De exemplu, caracteristici importante cum ar fi linii și curbe pot fi extrase utilizând detectarea marginilor, care sunt utilizate în mod normal de către algoritmi de vizibilitate la nivel superior sau de prelucrare a imaginilor. Un algoritm bun de detectare a marginilor ar evidenția locațiile marginilor majore dintr-o imagine, ignorând, în același timp, orice margini false cauzate de zgomot. 

Dar care sunt marginile oricum? Muchiile sunt caracteristici de imagine care pot fi folosite în estimarea și analizarea structurii obiectelor dintr-o imagine. Acestea reprezintă schimbări locale semnificative care au avut loc în intensitatea imaginii (adică valoarea pixelilor). În mod normal, marginile apar la limita dintre două regiuni diferite din imagine.

În acest tutorial, voi descrie algoritmul detector de margine Canny și cum îl putem implementa în Python.

Canny Detector de margine

Algoritmul detectorului de margine Canny este numit după inventatorul său, John F. Canny, care a inventat algoritmul în 1986. Detectorul de margine Canny are ca imagine de intrare o imagine în tonuri de gri și produce o imagine care indică localizarea discontinuităților de intensitate ca ieșiri (adică marginile).

Nu vreau să merg matematic aici, dar voi descrie ce se întâmplă în spatele scenei în algoritmul detectorului de margine Canny dintr-un punct de vedere la nivel înalt.

Primul lucru pe care detectorul de margine Canny îl are este că utilizează convoluția Gaussian pentru a alinia imaginea de intrare și pentru a elimina zgomotul. Un prim operator de derivate este apoi aplicat pe imaginea netezită pentru a evidenția acele regiuni ale imaginii cu primii derivați spațiali.

Apoi, algoritmul găsește atât mărimea, cât și direcția de gradient prin calcularea derivatului x și a derivatului y, mai ales că știind direcția gradientului ne permite să găsim direcția marginilor.

Algoritmul efectuează apoi ceea ce se numește suprimarea non-maximă, unde se urmărește de-a lungul vârfului crestăturilor care se ridică de la margini și setează acei pixeli care nu se află pe vârful creastei până la zero, generând eventual o linie subțire în rezultatul. 

Cu alte cuvinte, verificăm dacă gradientul calculat în etapa anterioară este considerat maxim între punctele vecine situate atât în ​​direcția pozitivă, cât și în cea negativă a gradientului. Dacă gradientul a fost maxim, este considerat a fi parte a marginii și invers.

Procesul de urmărire de mai sus este controlat de două praguri, T1 și t2, astfel încât t1> t2, referit ca hysteresis thresholding.Urmărirea începe într-un punct de pe creastă mai mare decât T1, și apoi continuă în ambele direcții din acel punct până când înălțimea crestei devine mai mică decât t2

Deci, în principiu, ceea ce se întâmplă aici este faptul că selectăm toate punctele de margine care sunt deasupra pragului superior T1, și apoi să investigheze dacă există vecini din aceste puncte care sunt considerate sub pragul superior T1 și peste pragul inferior t2. În acest caz, astfel de vecini ar fi parte a marginea.

Astfel, lăţime din kernelul gaussian folosit pentru netezirea imaginii de intrare, și T1 (superioară) și t2 (inferioare) utilizate de tracker, sunt parametrii care determină efectul detectorului de margine.

Implementarea Python

În această secțiune, voi descrie două moduri în care putem implementa detectorul de margine Canny. O modalitate utilizează scikit-image biblioteca, iar cealaltă utilizează OpenCV bibliotecă.

Canny Edge Detector folosind scikit-image

Dacă nu aveți scikit-image deja instalat pe aparat, continuați și instalați-l urmând instrucțiunile afișate pe pagina de instalare a imaginii scikit.

Cum folosesc un Ubuntu mașină, pur și simplu a trebuit să rulez următoarea comandă în Terminalul meu pentru a pune biblioteca în funcțiune:

sudo apt-get instala python-skimage

scikit-image biblioteca are a șiret () funcție pe care o putem folosi pentru a aplica detectorul de margine Canny pe imaginea noastră. Observați că această funcție face parte din caracteristică modul.

Înainte de a merge mai departe, să folosim o imagine de jucărie pentru a experimenta. Totuși, puteți folosi orice imagine. Voi folosi imaginea boat.png prezentată mai jos (faceți clic pe linkul pentru a descărca imaginea):

Fără să mai vorbim, să vedem cum putem detecta marginile din imaginea de mai sus (adică barca) folosind detectorul de margine Canny. Amintiți-vă că imaginea noastră trebuie să fie în tonuri de gri. Din moment ce imaginea noastră este deja în tonuri de gri, nu avem nevoie să facem nimic în acest moment, cum ar fi convertirea imaginii de la culoarea la tonuri de gri. Scenariul pentru detectorul de margine Canny arată după cum urmează:

de la importul de skimage io de la importul de skimage im = io.imread ('boat.png') edges = feature.canny (im) io.imshow (margini) io.show

Deci, după cum puteți vedea, am citit mai întâi imaginea noastră, boat.png. După aceea, aplicăm șiret () funcția pe imagine (nu am trecut parametrii personalizați, cu excepția imaginii noastre și l-am lăsat la valorile implicite ale funcției). În final, afișăm rezultatul care arată marginile detectate. Rezultatul scriptului de mai sus arată după cum urmează:

Puteți juca cu parametrii pentru a obține rezultate diferite cu privire la modul în care sunt detectate marginile. Dar rezultatul arată frumos cu marginile detectate, nu-i așa??!

Canny Edge Detector folosind OpenCV

În această secțiune, vom vedea cum putem folosi OpenCV pentru a aplica detectorul de margine Canny pe imaginea barcii noastre. Dacă nu aveți încă OpenCV instalat, continuați și instalați-l. Puteți verifica următoarele articole despre cum puteți instala OpenCV pe mașina dvs. Am inclus articole diferite pentru diferite sisteme de operare:

  • Ubuntu 16.04: Cum se instalează OpenCV
  • Instalați OpenCV-Python în Windows
  • Instalați OpenCV 3 pe MacOS

Ca și în cazul scikit-image bibliotecă, OpenCV are de asemenea o funcție numită șiret () pentru a aplica algoritmul detector de margine Canny pe imagine. Următorul script arată cum putem folosi OpenCV pentru a găsi marginile din imaginea noastră:

import cv2 import matplotlib.pyplot ca plt im = cv2.imread ('barca.png') marginile = cv2.Canny (im, 25,255, L2gradient = False) plt.imshow (margin, cmap = 'gri') plt.show )

Observați că am trecut următoarele argumente în favoarea Canny () funcţie:

  • Sunt: numele imaginii
  • prag inferior: 25
  • prag superior: 255
  • L2gradient = False: aceasta înseamnă că se folosește norma L1. Dacă este setat la Adevărat, se va folosi norma L2.

matplotlib biblioteca a fost apoi utilizată pentru a compila rezultatele. Pentru a afla mai multe despre această bibliotecă, consultați tutorialul meu: Introducerea Bibliotecii Matplotlib a Python. 

Rezultatul scriptului de mai sus este următorul:

Concluzie

În acest tutorial, am aflat despre detectorul de margine Canny și am văzut cum scikit-image și OpenCV bibliotecile ne permit să implementăm cu ușurință acest detector cu câteva linii de cod.

Cod