OpenCV sobel()-Funktion

Manav Narula 18 August 2022
  1. Kantenerkennung mit der Funktion Sobel() mit OpenCV in Python
  2. Fazit
OpenCV sobel()-Funktion

Mit der OpenCV-Bibliothek können wir verschiedene Techniken verarbeiten und auf Bilder anwenden. Solche Prozesse sind ein integraler Bestandteil komplizierter Computer-Vision-Aufgaben, und eine solche Aufgabe ist die Kantenerkennung in Bildern.

Kanten sind die Grenzen oder Umrisse von Objekten in einem Bild und sind mit sehr starken Änderungen der Pixeldichte verbunden. Durch den Vergleich der Dichte benachbarter Pixel können wir Kanten erkennen.

Für die Kantenerkennung stehen verschiedene Algorithmen zur Verfügung, die in der OpenCV-Bibliothek angewendet werden. Eine solche Technik ist der Sobel Edge Detection-Algorithmus.

Dieses Tutorial demonstriert den Sobel-Algorithmus mit OpenCV in Python.

Kantenerkennung mit der Funktion Sobel() mit OpenCV in Python

Der Sobel-Kantenerkennungsalgorithmus verwendet den Bildgradienten, um die Kanten in einem Bild vorherzusagen und zu finden. Wir vergleichen die Pixeldichte, um Kanten mit diesem Algorithmus zu erkennen.

Wir berechnen die erste Ableitung der Funktion, um die Spitzenpunkte zu finden. Diese werden dann mit dem Schwellwert verglichen.

Bei dieser Technik berechnet der Sobel-Operator den Gradienten der Funktion. Es kombiniert die Gaußsche Glättung und Differenzierung.

Im Allgemeinen verwenden wir Kernel, um ein Bild zu glätten oder zu verwischen, aber in diesem Fall werden wir sie verwenden, um die Farbverläufe zu berechnen. Die Ableitungen werden sowohl entlang der x- als auch der y-Achse berechnet.

Die Steigung an einem bestimmten Punkt wird mit diesen beiden Werten berechnet. Dieser Gradientenwert ist weniger rauschanfällig und wird dann zur Kantenerkennung verwendet.

Die OpenCV-Bibliothek implementiert dies mit der Funktion Sobel(). Wir müssen die Funktion mit mehreren Parametern zusammen mit dem Bild angeben.

Wir müssen die Tiefe des endgültigen Bildes erwähnen, die mit dem Parameter ddepth angegeben wird. Mit dem Wert -1 hat das Ausgabebild die gleiche Tiefe wie das Eingabebild.

Die Reihenfolge der zu verwendenden Ableitungen wird mit den Parametern dx und dy festgelegt. Die Größe des erweiterten Sobel-Kernels wird mit dem Parameter ksize angegeben.

Die Parameter scale und delta sind optional. Sehen wir uns nun ein Beispiel an.

import cv2

i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)

edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=1, ksize=5)

cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

Ausgabe:

Kantenerkennung mit Sobel entlang der X- und Y-Achse

Im obigen Beispiel haben wir die Funktion Sobel() verwendet. Wir haben die Ableitung erster Ordnung entlang der x- und y-Achse berechnet und den Gradienten erhalten, der dann verwendet wird, um die Umrisse zu finden.

Das endgültige Bild hat 64 Bit, wie im Parameter ddepth angegeben. Der verwendete Kernel hat die Größe 5x5.

Beachten Sie die Funktion GaussianBlur(); Es wird verwendet, um ein bestimmtes Bild zu verwischen, und ein Sobel-Operator funktioniert am besten bei unscharfen Bildern. Die Funktionen waitKey() und destroyAllWindows() verhindern das Schließen des Ausgabefensters und warten darauf, dass der Benutzer eine Taste zum Beenden drückt.

Wie besprochen haben wir im obigen Beispiel die Ableitung entlang der x- und y-Achse berechnet. Wir können die Ableitung auch zusammen mit einer der beiden Achsen berechnen, indem wir die Ableitung der anderen als 0 setzen.

Zum Beispiel,

import cv2

i = cv2.imread("deftstack.png")
img = cv2.GaussianBlur(i, (3, 3), sigmaX=0, sigmaY=0)

edge_sobel = cv2.Sobel(src=img, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5)

cv2.imshow("Output", edge_sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

Ausgabe:

Kantenerkennung mit Sobel entlang der X-Achse

Im obigen Code berechnen wir die Ableitung nur in horizontaler Richtung und setzen den Wert des Parameters dy auf 0. Um die Ableitung vertikal zu berechnen, setzen wir den Parameter dx auf 0.

Beachten Sie, dass wir in unseren Beispielen die Kernelgröße als 5x5 verwendet haben. Wir können auch die 3x3-Größe verwenden, aber das Ergebnis enthält in diesem Fall viele Ungenauigkeiten und wird nicht empfohlen.

Der Scharr-Filter ist ein weiterer Operator ähnlich dem Sobel und kann in 3x3-Fällen verwendet werden.

Fazit

Dieses Tutorial hat die Verwendung der Funktion Sobel() aus der OpenCV-Bibliothek demonstriert. Wir begannen damit, den Sobel-Algorithmus für die Kantenerkennung zu verstehen.

Wir haben die Grundlagen von Bildverläufen verstanden und wie der Sobel-Operator diese effizient berechnet. Beispiele für verschiedene Situationen werden im Artikel gezeigt.

Der Nachteil der Verwendung eines 3x3-Kernels wird ebenfalls diskutiert, und dessen Alternative, der Scharr-Filter, kann in diesem Fall verwendet werden, um bessere Ergebnisse zu liefern.

Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

Verwandter Artikel - Python OpenCV

Verwandter Artikel - OpenCV Image