Canny Edge Detector cu OpenCV

Canny Edge Detector cu OpenCV


Canny Edge Detection este o tehnică populară de procesare a imaginilor folosită pentru detectarea marginilor în imagini. Este un algoritm robust, care se bazează pe un proces în mai mulți pași, cum ar fi filtrarea Gaussiană, calculul gradientului și urmărirea marginilor.

În acest tutorial, vom explora:
1. Teoria din spatele Canny Edge Detection.
2. Implementarea în Python folosind OpenCV.
3. Parametrii cheie și impactul lor asupra rezultatului.


Teoria din spatele Canny Edge Detection

Canny Edge Detection implică mai multe etape:
1. Filtrare Gaussiană: Elimină zgomotul din imagine folosind un filtru gaussian, care netezește imaginea.
2. Calculul gradientului: Se determină intensitatea gradientului și direcția acestuia folosind operatori de tip Sobel.
3. Non-maximum suppression: Reducerea la un singur pixel pentru marginile detectate, pentru a elimina răspunsurile slabe.
4. Thresholding cu histerezis: Marginile sunt clasificate ca puternice sau slabe, iar cele slabe sunt păstrate doar dacă sunt conectate la margini puternice.


Exemplu de cod

Mai jos este un exemplu practic de utilizare a detectorului de margini Canny cu OpenCV.
Primul pas este crearea unui fișier nou numit edges.py, iar apoi adăugați următorul conținut:

import cv2
import numpy as np

image_path = 'images/drop.jpg' 
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

blurred = cv2.GaussianBlur(image, (5, 5), 1.4)

low_threshold = 50
high_threshold = 150
edges = cv2.Canny(blurred, low_threshold, high_threshold)

cv2.imwrite("edges.jpg", edges)



Explicație Pas cu Pas

Încărcarea imaginii
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)


Pentru acest exemplu folosim imaginea drop.jpg din directorul cu imagini de test images, însă puteți experimenta cu oricare altă imagine.

Imaginea este încărcată în tonuri de gri deoarece algoritmul Canny operează pe imagini monocrome.

Filtrarea Gaussiană
blurred = cv2.GaussianBlur(image, (5, 5), 1.4)


- Kernel-ul Gaussian (5, 5) este dimensiunea matricei utilizate pentru netezirea imaginii. Dimensiuni mai mari reduc mai mult zgomotul, dar pot estompa detaliile. - Sigma 1.4 controlează intensitatea netezirii.

Detectarea Marginilor
edges = cv2.Canny(blurred, low_threshold, high_threshold)


  • low_threshold și high_threshold controlează histerezisul. Marginile mai puternice (cu gradient mare) sunt clasificate imediat, iar cele slabe sunt conectate pe baza valorilor vecine.
  • Ajustarea acestor praguri poate influența sensibilitatea algoritmului.
Salvarea imaginii
cv2.imwrite("edges.jpg", edges)


Pentru vizualizarea imaginii trebuie mai întâii să o salvăm cu modificările aduse ca mai apoi să o putem deschide în editorul VSCode.

Pentru a rula codul utilizăm comanda:

python3 edges.py


După executarea programului un fișier nou numit edges.jpg ar trebui să fie creat în folderul de lucru. Acest fișier conține imaginea rezultată după aplicarea filtrului Canny și ar trebui să arate similar cu imaginea de mai jos:


Parametrii Cheie și Efectele Lor

  1. Dimensiunea kernel-ului Gaussian:

    • Dimensiuni mai mari elimină mai mult zgomot, dar pot elimina și detaliile fine.
  2. Pragurile inferioare și superioare:

    • Valori mai mici detectează mai multe margini, inclusiv zgomot.
    • Valori mai mari elimină zgomotul, dar pot omite detalii importante.
Experimentează modificând valorile pentru a observa impactul asupra rezultatului.

Concluzie

Canny Edge Detector este o metodă eficientă pentru detectarea marginilor în imagini. Prin ajustarea parametrilor, poate fi adaptat pentru o gamă largă de aplicații, cum ar fi recunoașterea obiectelor, segmentarea imaginilor sau urmărirea contururilor. Folosind acest tutorial, poți înțelege cum să implementezi această tehnică și să optimizezi rezultatele pentru nevoile tale specifice.


Trebuie să fii autentificat pentru a accesa editorul de cod și pentru a experimenta codul prezentat în acest tutorial.

Intră în cont