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
șihigh_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
Dimensiunea kernel-ului Gaussian:
- Dimensiuni mai mari elimină mai mult zgomot, dar pot elimina și detaliile fine.
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.