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:

FunktionAlgorithmusBeschreibungGeeignete Szenarien
cv2.Canny()Canny-KantenerkennungMehrstufiger Algorithmus, gute Erkennungsleistung, starke Rauschunterdrückungsfähigkeit.Universelle Kantenerkennung, geeignet für die meisten Szenarien.
cv2.Sobel()Sobel-OperatorKantenerkennung basierend auf Ableitungen erster Ordnung; kann horizontale und vertikale Kanten erkennen.Horizontale und vertikale Kanten erkennen.
cv2.Scharr()Scharr-OperatorEine verbesserte Version des Sobel-Operators mit stärkerer Reaktion auf Kanten.Subtile Kanten erkennen.
cv2.Laplacian()Laplace-OperatorKantenerkennung 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:

  1. Rauschunterdrückung: Verwenden Sie einen Gauß-Filter, um das Bild zu glätten, um den Einfluss von Rauschen zu reduzieren.
  2. Gradientenberechnung: Verwenden Sie den Sobel-Operator, um den Gradientenbetrag und die Richtung des Bildes zu berechnen.
  3. Nicht-Maximum-Unterdrückung: Behalten Sie entlang der Gradientenrichtung die Pixel mit dem maximalen lokalen Gradienten und unterdrücken Sie andere Pixel.
  4. 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.
  5. 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 cv2
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 cv2
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 cv2
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:

FunktionAlgorithmusVorteileNachteileGeeignete Szenarien
cv2.Canny()Canny-KantenerkennungStarke Rauschunterdrückung, gute Kantenerkennungsleistung.Die Parameterabstimmung ist relativ komplex.Universelle Kantenerkennung, geeignet für die meisten Szenarien.
cv2.Sobel()Sobel-OperatorEinfache Berechnung, geeignet zur Erkennung horizontaler und vertikaler Kanten.Empfindlich gegenüber Rauschen, durchschnittliche Kantenerkennungsleistung.Horizontale und vertikale Kanten erkennen.
cv2.Scharr()Scharr-OperatorStärkere Reaktion auf Kanten, geeignet zur Erkennung subtiler Kanten.Empfindlich gegenüber Rauschen.Subtile Kanten erkennen.
cv2.Laplacian()Laplace-OperatorKann Kanten und Ecken erkennen.Sehr empfindlich gegenüber Rauschen.Kanten und Ecken erkennen.
Andere Erweiterungen