OpenCV Edge Detection in Python mit cv2.Canny() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

OpenCV-Kantenerkennung in Python mit cv2.Canny()

Einleitung

Kantenerkennung ist etwas, was wir natürlich tun, aber es ist nicht so einfach, wenn es darum geht, Regeln für Computer zu definieren. Während verschiedene Methoden entwickelt wurden, wurde die vorherrschende Methode 1986 von John F. Canny entwickelt und trägt den treffenden Namen Canny-Methode.

Es ist schnell, ziemlich robust und funktioniert so gut wie möglich für die Art von Technik, um die es geht. Am Ende des Leitfadens wissen Sie, wie Sie eine Echtzeit-Kantenerkennung für Videos durchführen und etwas in der Art von Folgendem produzieren:

Canny Edge-Erkennung

Was ist die Canny-Methode? Es besteht aus vier verschiedenen Operationen:

  • Gaußsche Glättung
  • Gradienten berechnen
  • Non-Max-Unterdrückung
  • Hystereseschwellenwert

Gaußsche Glättung wird als erster Schritt verwendet, um das Eingabebild „auszubügeln“ und das Rauschen weicher zu machen, wodurch die endgültige Ausgabe viel sauberer wird.

Bildverläufe wurden in früheren Anwendungen zur Kantenerkennung verwendet. Vor allem Sobel- und Scharr-Filter basieren auf Bildverläufen. Der Sobel-Filter läuft auf zwei Kerne hinaus (Gx und Gy), woher Gx erkennt horizontale Änderungen, während Gy erkennt vertikale Änderungen:

G

x

=

[

-
1

0

+
1

-
2

0

+
2

-
1

0

+
1

]

G

y

=

[

-
1

-
2

-
1

0

0

0

+
1

+
2

+
1

]

Wenn Sie sie über ein Bild schieben, „heben“ (betonen) sie jeweils die Linien in ihrer jeweiligen Ausrichtung. Scharr-Kernel funktionieren auf die gleiche Weise, mit unterschiedlichen Werten:

G

x

=

[

+
3

0

-
3

+
10

0

-
10

+
3

0

-
3

]

G

y

=

[

+
3

+
10

+
3

0

0

0

-
3

-
10

-
3

]

Diese Filter, sobald sie über das Bild gefaltet sind, erzeugen Feature-Maps:

OpenCV Edge Detection in Python mit cv2.Canny() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Bildnachweis: Davidwkennedy

Für diese Feature-Maps können Sie die berechnen Gradientengröße und Gradientenorientierung – dh wie stark die Veränderung ist (wie wahrscheinlich es ist, dass etwas eine Kante ist) und in welche Richtung die Veränderung zeigt. Da Gy die vertikale Änderung (Y-Gradient) und Gx die horizontale Änderung (X-Gradient) bezeichnet, können Sie die Größe berechnen, indem Sie einfach den Satz des Pythagoras anwenden, um die Hypothenuse des Dreiecks zu erhalten, das durch das „linke“ und gebildet wird „richtige“ Richtungen:

$$
{G} ={sqrt {{{G} _{x}}^{2}+{{G} _{y}}^{2}}}
$$

Mit der Größe und Ausrichtung können Sie ein Bild mit hervorgehobenen Kanten erzeugen:

OpenCV Edge Detection in Python mit cv2.Canny() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Bildnachweis: Davidwkennedy

Wie viel Lärm aber auch eingefangen wurde, sieht man an der Beschaffenheit der Ziegel! Bildverläufe sind sehr rauschempfindlich. Aus diesem Grund wurden Sobel- und Scharr-Filter als Komponente verwendet, aber nicht als einziger Ansatz in Cannys Methode. Auch hier hilft die Gaußsche Glättung.

Non-Max-Unterdrückung

Ein auffälliges Problem beim Sobel-Filter ist, dass die Kanten nicht wirklich klar sind. Es ist nicht so, als hätte jemand einen Bleistift genommen und eine Linie gezogen, um eine Lineart des Bildes zu erstellen. Die Kanten sind in Bildern normalerweise nicht so klar geschnitten, da das Licht allmählich streut. Wir können jedoch die gemeinsame Linie in den Rändern finden und den Rest der Pixel um sie herum unterdrücken, wodurch stattdessen eine saubere, dünne Trennlinie entsteht. Dies wird als Non-Max-Unterdrückung bezeichnet! Die Nicht-Max-Pixel (die kleiner sind als die, mit denen wir sie in einem kleinen lokalen Feld vergleichen, z. B. einem 3 × 3-Kernel) werden unterdrückt. Das Konzept ist auf mehr Aufgaben als diese anwendbar, aber lassen Sie es uns vorerst an diesen Kontext binden.

Hystereseschwellenwert

Viele Nichtkanten können und werden wahrscheinlich aufgrund der Lichtverhältnisse, der Materialien im Bild usw. als Kanten bewertet. Aufgrund der verschiedenen Gründe, warum diese Fehleinschätzungen auftreten, ist es schwierig, eine automatische Bewertung darüber vorzunehmen, was eine Kante ist und was nicht 't. Sie können Gradienten mit Schwellenwerten festlegen und nur die stärkeren einbeziehen, vorausgesetzt, dass „echte“ Kanten intensiver sind als „falsche“ Kanten.

Schwellwerte funktionieren auf die gleiche Weise wie üblich – wenn der Gradient unter einem unteren Schwellwert liegt, entfernen Sie ihn (nullen Sie ihn), und wenn er über einem bestimmten oberen Schwellwert liegt, behalten Sie ihn bei. Alles zwischen der unteren Grenze und der oberen Grenze befindet sich in der „Grauzone“. Wenn irgendeine Kante zwischen den Schwellen mit a verbunden ist definitive Kante (die über dem Schwellenwert) – sie werden auch als Kanten betrachtet. Wenn sie nicht verbunden sind, sind sie wahrscheinlich Artefakte einer falsch berechneten Kante.

Das ist Hystereseschwellenwert! Tatsächlich hilft es, die endgültige Ausgabe zu bereinigen und falsche Kanten zu entfernen, je nachdem, was Sie als falsche Kante klassifizieren. Um gute Schwellenwerte zu finden, experimentieren Sie im Allgemeinen mit unterschiedlichen Unter- und Obergrenzen für die Schwellenwerte oder wenden eine automatisierte Methode wie die Methode von Otsu oder die Dreiecksmethode an.

Laden wir ein Bild ein und stufen es in Graustufen ein (Canny, genauso wie Sobel/Scharr verlangt, dass Bilder in Graustufen umgewandelt werden):

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('finger.jpg', cv2.IMREAD_GRAYSCALE)
img_blur = cv2.GaussianBlur(img, (3,3), 0)

plt.imshow(img_blur, cmap='gray')

OpenCV Edge Detection in Python mit cv2.Canny() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Das Nahaufnahmebild eines Fingers dient als gutes Testfeld für die Kantenerkennung – es ist nicht einfach, einen Fingerabdruck von dem Bild zu unterscheiden, aber wir können ihn annähern.

Kantenerkennung auf Bildern mit cv2.Canny()

Cannys Algorithmus kann mit OpenCVs angewendet werden Canny() Verfahren:

cv2.Canny(input_img, lower_bound, upper_bound)

Sehen Sie sich unseren praxisnahen, praktischen Leitfaden zum Erlernen von Git an, mit Best Practices, branchenweit akzeptierten Standards und einem mitgelieferten Spickzettel. Hören Sie auf, Git-Befehle zu googeln und tatsächlich in Verbindung, um es!

Es kann schwierig sein, das richtige Gleichgewicht zwischen Untergrenze und Obergrenze zu finden. Wenn beide niedrig sind, haben Sie wenige Kanten. Wenn die untere Grenze niedrig und die obere hoch ist, haben Sie Rauschen. Wenn beide hoch und nahe beieinander liegen, haben Sie wenige Kanten. Der richtige Punkt hat gerade genug Abstand zwischen den Grenzen und hat sie auf der richtigen Skala. Experiment!

Das Eingabebild wird durch die Canny-Methode unkenntlich gemacht, aber oft profitieren Sie davon, es unkenntlich zu machen Bevor es geht auch rein. Die Methode wendet eine 5×5 Gaußsche Unschärfe auf die Eingabe an, bevor sie die restlichen Operationen durchläuft, aber selbst mit dieser Unschärfe kann immer noch etwas Rauschen durchsickern, also haben wir das Bild unscharf gemacht, bevor wir es in den Algorithmus einspeisen:


edge = cv2.Canny(img_blur, 20, 30)

fig, ax = plt.subplots(1, 2, figsize=(18, 6), dpi=150)
ax[0].imshow(img, cmap='gray')
ax[1].imshow(edge, cmap='gray')

Das führt zu:

OpenCV Edge Detection in Python mit cv2.Canny() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Die Werte von 20 und 30 hier sind nicht willkürlich – ich habe die Methode mit verschiedenen Parametern getestet und einen Satz ausgewählt, der ein anständiges Ergebnis zu liefern schien. Können wir versuchen, dies zu automatisieren?

Automatisiertes Thresholding für cv2.Canny()?

Können Sie einen optimalen Satz von Schwellenwerten finden? Ja, aber es funktioniert nicht immer. Sie können Ihre eigene Berechnung für einen guten Wert durchführen und dann den Bereich mit a anpassen sigma um diese Schwelle herum:

lower_bound = (1-sigma)*threshold
upper_bound = (1+sigma)*threshold

Wann sigma, ist sagen, 0.33 – die Grenzen werden sein 0.66*threshold und 1.33*threshold, was einen Bereich von ~ 1/3 um ihn herum zulässt. Das Finden der threshold ist was schwieriger. OpenCV bietet uns die Methode von Otsu (funktioniert hervorragend für bimodale Bilder) und die Triangle-Methode. Lassen Sie uns beide ausprobieren und als dritte Option einen einfachen Median der Pixelwerte nehmen:

otsu_thresh, _ = cv2.threshold(img_blur, 0, 255, cv2.THRESH_OTSU)
triangle_thresh, _ = cv2.threshold(img_blur, 0, 255, cv2.THRESH_TRIANGLE)
manual_thresh = np.median(img_blur)

def get_range(threshold, sigma=0.33):
    return (1-sigma) * threshold, (1+sigma) * threshold

otsu_thresh = get_range(otsu_thresh)
triangle_thresh = get_range(triangle_thresh)
manual_thresh = get_range(manual_thresh)

print(f"Otsu's Threshold: {otsu_thresh} nTriangle Threshold: {triangle_thresh} nManual Threshold: {manual_thresh}")

Das führt zu:

Otsu's Threshold: (70.35, 139.65) 
Triangle Threshold: (17.419999999999998, 34.58) 
Manual Threshold: (105.18999999999998, 208.81)

Diese sind ziemlich unterschiedlich! Von den Werten, die wir zuvor gesehen haben, können wir davon ausgehen, dass die Triangle-Methode hier am besten funktioniert. Der manuelle Schwellenwert ist nicht sehr informiert, da er nur den mittleren Pixelwert verwendet und am Ende einen hohen Basisschwellenwert hat, der für dieses Bild weiter in einen weiten Bereich multipliziert wird. Darunter leidet die Methode von Otsu weniger, aber dennoch.

Wenn wir die ausführen Canny() Methode mit diesen Schwellenbereichen:

edge_otsu = cv2.Canny(img_blur, *otsu_thresh)
edge_triangle = cv2.Canny(img_blur, *triangle_thresh)
edge_manual = cv2.Canny(img_blur, *manual_thresh)

fig, ax = plt.subplots(1, 3, figsize=(18, 6), dpi=150)
ax[0].imshow(edge_otsu, cmap='gray')
ax[1].imshow(edge_triangle, cmap='gray')
ax[2].imshow(edge_manual, cmap='gray')

Hinweis: Die Funktion erwartet mehrere Argumente, und unsere Schwellenwerte sind ein einziges Tupel. Wir können destrukturieren das Tupel in mehrere Argumente, indem Sie ihm voranstellen *. Dies funktioniert auch mit Listen und Mengen und ist eine großartige Möglichkeit, mehrere Argumente bereitzustellen, nachdem sie programmgesteuert abgerufen wurden.

Das führt zu:

OpenCV Edge Detection in Python mit cv2.Canny() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Die Triangle-Methode hat hier ziemlich gut funktioniert! Dies ist keine Garantie dafür, dass es auch in anderen Fällen gut funktioniert.

Kantenerkennung in Echtzeit bei Videos mit cv2.Canny()

Lassen Sie uns abschließend die Canny-Kantenerkennung in Echtzeit auf ein Video anwenden! Wir zeigen das verarbeitete Video (jedes Bild so, wie es fertig ist) mit an cv2.imshow() die ein Fenster mit dem Rahmen anzeigt, den wir anzeigen möchten. Wir speichern das Video jedoch auch in einer MP4-Datei, die später eingesehen und geteilt werden kann.

Um ein Video mit OpenCV zu laden, verwenden wir die VideoCapture() Methode. Wenn wir vorbeikommen 0 – es wird von der aktuellen Webcam aufgenommen, sodass Sie den Code auch auf Ihrer Webcam ausführen können! Wenn Sie einen Dateinamen übergeben, wird die Datei geladen:

def edge_detection_video(filename):
    cap = cv2.VideoCapture(filename)
    
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter('output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))), isColor=False)
    
    while cap.isOpened():
        (ret, frame) = cap.read()
        if ret == True:
            frame = cv2.GaussianBlur(frame, (3, 3), 0)
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            edge = cv2.Canny(frame, 50, 100)
            out.write(edge)
            cv2.imshow('Edge detection', edge)
        else:
            break

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

    cap.release()
    out.release()
    cv2.destroyAllWindows()

edge_detection_video('secret_video.mp4')

Das VideoWriter akzeptiert mehrere Parameter – den Ausgabedateinamen, den FourCC (vier Codec-Codes, die den Codec angeben, der zum Codieren des Videos verwendet wird), die Framerate und die Auflösung als Tupel. Um das Video nicht zu erraten oder zu skalieren – wir haben die Breite und Höhe des Originalvideos verwendet, das durch das erhalten wurde VideoCapture Instanz, die Daten über das Video selbst enthält, wie z. B. Breite, Höhe, Gesamtzahl der Frames usw.

Während die Aufnahme geöffnet ist, versuchen wir den nächsten Frame mit einzulesen cap.read(), die einen Ergebniscode und den nächsten Frame zurückgibt. Der Ergebniscode ist True or False, was das Vorhandensein des nächsten Rahmens oder dessen Fehlen anzeigt. Nur wenn ein Frame vorhanden ist, versuchen wir, ihn weiter zu verarbeiten, andernfalls unterbrechen wir die Schleife. Für jeden gültigen Frame lassen wir ihn durch eine Gaußsche Unschärfe laufen, wandeln ihn in Graustufen um und führen ihn aus cv2.Canny() darauf und schreiben Sie es mit der VideoWriter auf die Festplatte und Anzeige mit cv2.imshow() für eine Live-Ansicht.

Schließlich geben wir Capture und Video Writer frei, da beide mit Dateien auf der Festplatte arbeiten, und zerstören alle vorhandenen Fenster.

Wenn Sie die Methode mit a ausführen secret_video.mp4 input – Sie sehen ein Popup-Fenster und sobald es fertig ist, eine Datei in Ihrem Arbeitsverzeichnis:

OpenCV Edge Detection in Python mit cv2.Canny() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Zusammenfassung

In diesem Leitfaden haben wir uns die Funktionsweise der Canny-Kantenerkennung und ihre Bestandteile angesehen – Gaußsche Glättung, Sobel-Filter und Bildverläufe, Non-Max-Unterdrückung und Hysterese-Schwellenwert. Schließlich haben wir Methoden zur automatisierten Schwellenbereichssuche für die Canny-Kantenerkennung mit untersucht cv2.Canny(), und wendete die Technik auf ein Video an, wodurch eine Kantenerkennung in Echtzeit bereitgestellt und die Ergebnisse in einer Videodatei gespeichert wurden.

Weiter gehen – Praktisches Deep Learning für Computer Vision

Ihre neugierige Natur macht Lust auf mehr? Wir empfehlen Ihnen, sich unsere anzuschauen Kurs: „Praxisnahes Deep Learning für Computer Vision mit Python“.

OpenCV Edge Detection in Python mit cv2.Canny() PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Ein weiterer Computer Vision-Kurs?

Wir werden keine Klassifizierung von MNIST-Ziffern oder MNIST-Mode durchführen. Sie haben ihren Teil vor langer Zeit erfüllt. Zu viele Lernressourcen konzentrieren sich auf grundlegende Datensätze und grundlegende Architekturen, bevor fortgeschrittene Blackbox-Architekturen die Last der Leistung schultern.

Wir wollen uns konzentrieren Entmystifizierung, Praktikabilität, Verständnis, Intuition und echte Projekte. Möchte lernen wie du kannst einen Unterschied machen? Wir nehmen Sie mit auf eine Reise von der Art und Weise, wie unser Gehirn Bilder verarbeitet, über das Schreiben eines forschungstauglichen Deep-Learning-Klassifikators für Brustkrebs bis hin zu Deep-Learning-Netzwerken, die „halluzinieren“, Ihnen die Prinzipien und die Theorie durch praktische Arbeit beibringen und Sie mit dem ausstatten Know-how und Tools, um ein Experte für die Anwendung von Deep Learning zur Lösung von Computer Vision zu werden.

Was ist da drin?

  • Die ersten Prinzipien des Sehens und wie Computern das „Sehen“ beigebracht werden kann
  • Verschiedene Aufgaben und Anwendungen von Computer Vision
  • Das Handwerkszeug, das Ihnen die Arbeit erleichtert
  • Suchen, Erstellen und Verwenden von Datensätzen für Computer Vision
  • Die Theorie und Anwendung von Convolutional Neural Networks
  • Umgang mit Domänenverschiebung, Kookkurrenz und anderen Verzerrungen in Datensätzen
  • Übertragen Sie Lernen und nutzen Sie die Trainingszeit und Rechenressourcen anderer zu Ihrem Vorteil
  • Aufbau und Schulung eines hochmodernen Brustkrebsklassifikators
  • Wie man Mainstream-Ideen mit einer gesunden Portion Skepsis begegnet und die Auswirkungen weit verbreiteter Techniken versteht
  • Visualisierung des „Konzeptraums“ eines ConvNet mit t-SNE und PCA
  • Fallstudien darüber, wie Unternehmen Computer-Vision-Techniken einsetzen, um bessere Ergebnisse zu erzielen
  • Richtige Modellbewertung, Visualisierung des latenten Raums und Identifizierung der Aufmerksamkeit des Modells
  • Durchführen von Domänenrecherchen, Bearbeiten eigener Datensätze und Etablieren von Modelltests
  • Modernste Architekturen, die Weiterentwicklung von Ideen, was sie einzigartig macht und wie man sie umsetzt
  • KerasCV – eine WIP-Bibliothek zum Erstellen hochmoderner Pipelines und Modelle
  • Wie man Papiere parst, liest und selbst umsetzt
  • Modellauswahl je nach Anwendung
  • Erstellen einer End-to-End-Pipeline für maschinelles Lernen
  • Landschaft und Intuition zur Objekterkennung mit Faster R-CNNs, RetinaNets, SSDs und YOLO
  • Instanz- und semantische Segmentierung
  • Objekterkennung in Echtzeit mit YOLOv5
  • Training von YOLOv5-Objektdetektoren
  • Arbeiten mit Transformers unter Verwendung von KerasNLP (industriestarke WIP-Bibliothek)
  • Integrieren von Transformers in ConvNets zum Generieren von Bildunterschriften
  • DeepDream
  • Deep-Learning-Modelloptimierung für Computer Vision

Zeitstempel:

Mehr von Stapelmissbrauch