OpenCV Bildkantenerkennung
Die Bildkantenerkennung ist eine grundlegende Aufgabe in der Computer Vision und Bildverarbeitung. Sie wird verwendet, um Regionen in einem Bild zu identifizieren, in denen sich die Helligkeit deutlich ändert, und diese Regionen entsprechen normalerweise den Grenzen von Objekten.
Die folgenden sind die häufig verwendeten Kantenerkennungsfunktionen in OpenCV und ihre Beschreibungen:
| Funktion | Algorithmus | Beschreibung | Geeignete Szenarien |
|---|---|---|---|
cv2.Canny() | Canny-Kantenerkennung | Mehrstufiger Algorithmus, gute Erkennungsleistung, starke Rauschunterdrückungsfähigkeit. | Universelle Kantenerkennung, geeignet für die meisten Szenarien. |
cv2.Sobel() | Sobel-Operator | Kantenerkennung basierend auf Ableitungen erster Ordnung; kann horizontale und vertikale Kanten erkennen. | Horizontale und vertikale Kanten erkennen. |
cv2.Scharr() | Scharr-Operator | Eine verbesserte Version des Sobel-Operators mit stärkerer Reaktion auf Kanten. | Subtile Kanten erkennen. |
cv2.Laplacian() | Laplace-Operator | Kantenerkennung basierend auf Ableitungen zweiter Ordnung, empfindlich gegenüber Rauschen. | Kanten und Ecken erkennen. |
1. Canny-Kantenerkennung (cv2.Canny())
Die Canny-Kantenerkennung ist ein mehrstufiger Kantenerkennungsalgorithmus, der 1986 von John F. Canny vorgeschlagen wurde.
Die Canny-Kantenerkennung gilt als der "Goldstandard" der Kantenerkennung, da sie ein gutes Gleichgewicht zwischen Rauschunterdrückung und Kantenlokalisierung erreicht.
1.1 Schritte der Canny-Kantenerkennung
Der Canny-Kantenerkennungsalgorithmus umfasst hauptsächlich die folgenden Schritte:
- Rauschunterdrückung: Verwenden Sie einen Gauß-Filter, um das Bild zu glätten, um den Einfluss von Rauschen zu reduzieren.
- Gradientenberechnung: Verwenden Sie den Sobel-Operator, um den Gradientenbetrag und die Richtung des Bildes zu berechnen.
- Nicht-Maximum-Unterdrückung: Behalten Sie entlang der Gradientenrichtung die Pixel mit dem maximalen lokalen Gradienten und unterdrücken Sie andere Pixel.
- Doppelschwellenwertdetektion: Verwenden Sie zwei Schwellenwerte (niedrig und hoch), um echte Kanten zu bestimmen. Pixel über dem hohen Schwellenwert gelten als starke Kanten, Pixel unter dem niedrigen Schwellenwert werden unterdrückt, und Pixel zwischen den beiden bleiben erhalten, wenn sie mit starken Kanten verbunden sind.
- Kantenverbindung: Durch Hysterese-Schwellenwertverfahren werden schwache Kanten mit starken Kanten verbunden, um vollständige Kanten zu bilden.
1.2 Implementierung der Canny-Kantenerkennung mit OpenCV
In OpenCV können Sie diecv2.Canny()Funktion zur Implementierung der Canny-Kantenerkennung.
Der Prototyp dieser Funktion sieht wie folgt aus:
edges = cv2.Canny(image, threshold1, threshold2, apertureSize=3, L2gradient=False)
image: Eingabebild, muss ein einkanaliges Graustufenbild sein.threshold1: Niedriger Schwellenwert.threshold2: Hoher Schwellenwert.apertureSize: Aperturgröße des Sobel-Operators, Standardwert ist 3.L2gradient: Ob die L2-Norm zur Berechnung der Gradientenstärke verwendet wird, Standardwert ist False (verwendet die L1-Norm).
Beispiel
import numpy as np
# Bild einlesen
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# Canny-Kantenerkennung anwenden
edges = cv2.Canny(image, 100, 200)
# Ergebnis anzeigen
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. Sobel-Operator (cv2.Sobel())
Der Sobel-Operator ist ein gradientenbasierter Kantenerkennungsoperator, der Kanten durch Berechnung der Gradienten des Bildes in horizontaler und vertikaler Richtung erkennt.
Der Sobel-Operator kombiniert Gauß-Glättung und Differenzierung, sodass er eine gewisse Unterdrückungswirkung auf Rauschen hat.
2.1 Prinzip des Sobel-Operators
Der Sobel-Operator verwendet zwei 3x3-Faltungskerne, um die Gradienten des Bildes in horizontaler bzw. vertikaler Richtung zu berechnen:
- Horizontaler Faltungskern:
[-1, 0, 1] [-2, 0, 2] [-1, 0, 1]
- Vertikaler Faltungskern:
[-1, -2, -1] [ 0, 0, 0] [ 1, 2, 1]
Durch diese beiden Faltungskerne lassen sich die Gradienten des Bildes in horizontaler bzw. vertikaler Richtung ermittelnGxundGy. Der endgültige Gradientenbetrag kann mit der folgenden Formel berechnet werden:
G = sqrt(Gx^2 + Gy^2)
2.2 Implementierung des Sobel-Operators mit OpenCV
In OpenCV können Sie diecv2.Sobel()Funktion zur Berechnung des Gradienten eines Bildes. Der Prototyp dieser Funktion sieht wie folgt aus:
dst = cv2.Sobel(src, ddepth, dx, dy, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
src: Eingabebild.ddepth: Tiefe des Ausgabebildes, üblicherweise verwendet mancv2.CV_64F。dx: Ordnung der Ableitung in x-Richtung.dy: Ordnung der Ableitung in y-Richtung.ksize: Größe des Sobel-Kerns, Standardwert ist 3.scale: Skalierungsfaktor, Standardwert ist 1.delta: Optionaler Delta-Wert, Standardwert ist 0.borderType: Randerweiterungstyp, Standard istcv2.BORDER_DEFAULT。
Beispiel
import numpy as np
# Bild einlesen
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# Berechne den Gradienten in x-Richtung
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
# Berechne den Gradienten in y-Richtung
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
# Berechne den Gradientenbetrag
sobel_combined = np.sqrt(sobel_x**2 + sobel_y**2)
# Ergebnis anzeigen
cv2.imshow('Sobel X', sobel_x)
cv2.imshow('Sobel Y', sobel_y)
cv2.imshow('Sobel kombiniert', sobel_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. Laplace-Operator (cv2.Laplacian())
Der Laplace-Operator ist ein Differentialoperator zweiter Ordnung, der Kanten durch Berechnung der zweiten Ableitung des Bildes erkennt. Der Laplace-Operator ist relativ empfindlich gegenüber Rauschen, daher wird das Bild üblicherweise vor der Verwendung mit einem Gauß-Filter geglättet.
3.1 Prinzip des Laplace-Operators
Der Laplace-Operator verwendet den folgenden Faltungskern, um die zweite Ableitung des Bildes zu berechnen:
[ 0, 1, 0] [ 1, -4, 1] [ 0, 1, 0]
Mit diesem Faltungskern kann der Laplace-Wert des Bildes ermittelt werden. Bereiche mit größeren Laplace-Werten entsprechen üblicherweise Kanten des Bildes.
3.2 Implementierung des Laplace-Operators mit OpenCV
In OpenCV können Sie diecv2.Laplacian()Funktion zur Berechnung des Laplace-Werts eines Bildes.
Der Prototyp dieser Funktion sieht wie folgt aus:
dst = cv2.Laplacian(src, ddepth, ksize=1, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
src: Eingabebild.ddepth: Tiefe des Ausgabebildes, üblicherweise verwendet mancv2.CV_64F。ksize: Größe des Laplace-Kernels, Standardwert ist 1.scale: Skalierungsfaktor, Standardwert ist 1.delta: Optionaler Delta-Wert, Standardwert ist 0.borderType: Randerweiterungstyp, Standard istcv2.BORDER_DEFAULT。
Beispiel
import numpy as np
# Bild einlesen
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
# Laplace-Operator anwenden
laplacian = cv2.Laplacian(image, cv2.CV_64F)
# Ergebnis anzeigen
cv2.imshow('Laplacian', laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()
Vergleich gängiger Kantenerkennungsfunktionen
Das Folgende ist ein Vergleich gängiger Kantenerkennungsfunktionen in OpenCV:
| Funktion | Algorithmus | Vorteile | Nachteile | Geeignete Szenarien |
|---|---|---|---|---|
cv2.Canny() | Canny-Kantenerkennung | Starke Rauschunterdrückung, gute Kantenerkennungsleistung. | Die Parameterabstimmung ist relativ komplex. | Universelle Kantenerkennung, geeignet für die meisten Szenarien. |
cv2.Sobel() | Sobel-Operator | Einfache Berechnung, geeignet zur Erkennung horizontaler und vertikaler Kanten. | Empfindlich gegenüber Rauschen, durchschnittliche Kantenerkennungsleistung. | Horizontale und vertikale Kanten erkennen. |
cv2.Scharr() | Scharr-Operator | Stärkere Reaktion auf Kanten, geeignet zur Erkennung subtiler Kanten. | Empfindlich gegenüber Rauschen. | Subtile Kanten erkennen. |
cv2.Laplacian() | Laplace-Operator | Kann Kanten und Ecken erkennen. | Sehr empfindlich gegenüber Rauschen. | Kanten und Ecken erkennen. |