Merkmalserkennung ist ein Bereich der Laptop Imaginative and prescient, der sich auf die Verwendung von Werkzeugen zur Erkennung interessanter Bereiche in Bildern konzentriert. Ein wesentlicher Aspekt der meisten Algorithmen zur Merkmalserkennung besteht darin, dass sie unter der Haube kein maschinelles Lernen einsetzen, wodurch die Ergebnisse besser interpretierbar und in einigen Fällen sogar schneller sind.

In den beiden vorherigen Artikeln dieser Serie haben wir uns die beliebtesten Operatoren zur Erkennung von Bildkanten angesehen: Sobel, Scharr, Laplacezusammen mit dem Gauß Wird zur Bildglättung verwendet. In der einen oder anderen Type verwendeten diese Operatoren verdeckte Bildableitungen und -verläufe, dargestellt durch Faltungskerne.

Wie bei Kanten wird bei der Bildanalyse häufig eine andere Artwork lokaler Bereiche untersucht: Ecken. Ecken treten seltener auf als Kanten und weisen normalerweise auf eine Änderung der Randrichtung eines Objekts oder auf das Ende eines Objekts und den Anfang eines anderen hin. Ecken sind seltener zu finden und liefern wertvollere Informationen.

Beispiel

Stellen Sie sich vor, Sie sammeln ein 2D-Puzzle. Was die meisten Leute am Anfang tun, ist, ein Stück mit einem Bildteil zu finden, der den Rand (Kante) eines Objekts enthält. Warum? Denn auf diese Weise ist es einfacher, benachbarte Teile zu identifizieren, da die Anzahl der Teile, die sich eine ähnliche Objektkante teilen, minimal ist.

Wir können sogar noch weiter gehen und uns darauf konzentrieren, nicht Kanten, sondern Ecken auszuwählen – einen Bereich, in dem ein Objekt seine Kantenrichtung ändert. Diese Stücke sind noch seltener als nur Kanten und ermöglichen aufgrund ihrer einzigartigen Type eine noch einfachere Suche nach anderen angrenzenden Fragmenten.

Im folgenden Puzzle gibt es beispielsweise 6 Kanten (B2, B3, B4, D2, D3Und D4) und nur 1 Ecke (C5). Wenn Sie die Ecke von Anfang an auswählen, lässt sich ihre Place leichter lokalisieren, da sie seltener als Kanten ist.

Ziel dieses Artikels ist es zu verstehen, wie Ecken erkannt werden können. Dazu werden wir die Particulars des Harris-Eckenerkennungsalgorithmus verstehen – eine der einfachsten und beliebtesten Methoden, die 1988 entwickelt wurde.

Idee

Nehmen wir drei Arten von Regionen: Wohnung, RandUnd Ecke. Die Struktur dieser Regionen haben wir oben bereits dargestellt. Unser Ziel wird es sein, die Verteilung der Gradienten in diesen drei Fällen zu verstehen.

Während unserer Analyse erstellen wir auch eine Ellipse, die den Großteil der dargestellten Punkte enthält. Wie wir sehen werden, liefert seine Type starke Hinweise auf die Artwork der Area, mit der wir es zu tun haben.

Flache Area

Ein flacher Bereich ist der einfachste Fall. Normalerweise weist der gesamte Bildbereich nahezu die gleichen Intensitätswerte auf, sodass die Gradientenwerte entlang der X- und Y-Achse gering sind und um 0 herum zentriert sind.

Indem wir die Gradientenpunkte (Gₓ, Gᵧ) aus dem obigen Beispiel für ein flaches Bild übernehmen, können wir ihre Verteilung darstellen, die wie folgt aussieht:

Wir können nun eine Ellipse um die dargestellten Punkte konstruieren, deren Mittelpunkt bei (0, 0) liegt. Dann können wir seine beiden Hauptachsen identifizieren:

  • Der Hauptachse entlang der die Ellipse maximal gestreckt ist.
  • Der Nebenachse entlang derer die Ellipse ihre minimale Ausdehnung erreicht.

Im Fall des flachen Bereichs kann es schwierig sein, visuell zwischen der Haupt- und Nebenachse zu unterscheiden, da die Ellipse wie in unserer Scenario tendenziell eine Kreisform hat.

Dennoch können wir dann für jede der beiden Hauptachsen die Ellipsenradien λ₁ und λ₂ berechnen. Wie im Bild oben gezeigt, sind sie nahezu gleich und haben kleine relative Werte.

Randbereich

Für den Randbereich ändert sich die Intensität nur in der Randzone. Außerhalb der Kante bleibt die Intensität nahezu gleich. Angesichts dessen sind die meisten Gradientenpunkte immer noch um (0, 0) zentriert.

Allerdings können sich die Steigungswerte in einem kleinen Bereich rund um die Randzone drastisch in beide Richtungen ändern. Im Bildbeispiel oben ist die Kante diagonal und wir können Änderungen in beide Richtungen erkennen. Daher ist die Gradientenverteilung in diagonaler Richtung verzerrt, wie unten gezeigt:

Für Randbereiche ist die dargestellte Ellipse typischerweise in eine Richtung geneigt und weist sehr unterschiedliche Radien λ₁ und λ₂ auf.

Eckregion

Bei Ecken bleiben die meisten Intensitätswerte außerhalb der Ecken gleich; Somit liegt die Verteilung für die Mehrzahl der Punkte immer noch nahe der Mitte (0, 0).

Wenn wir uns die Eckstruktur ansehen, können wir sie uns grob als einen Schnittpunkt zweier Kanten mit zwei unterschiedlichen Richtungen vorstellen. Für Kanten haben wir bereits im vorherigen Abschnitt besprochen, dass die Verteilung entweder in X oder Y oder in beiden Richtungen in die gleiche Richtung verläuft.

Indem wir zwei Kanten für die Ecke haben, erhalten wir am Ende zwei verschiedene Punktspektren, die vom Zentrum aus in zwei verschiedene Richtungen wachsen. Ein Beispiel ist unten dargestellt.

Wenn wir schließlich eine Ellipse um diese Verteilung konstruieren, werden wir feststellen, dass sie größer ist als im flachen Fall und im Kantenfall. Wir können dieses Ergebnis differenzieren, indem wir λ₁ und λ₂ messen, die in diesem Szenario viel größere Werte annehmen.

Visualisierung

Wir haben gerade drei Szenarien gesehen, in denen λ unterschiedliche Werte annahm. Um die Ergebnisse besser zu visualisieren, können wir das folgende Diagramm erstellen:

Diagramm, das die Beziehung zwischen Werten von λ und Regionstypen zeigt.

Formel

Um eine Area in eine von drei Zonen einteilen zu können, wird üblicherweise die folgende Formel zur Schätzung des R-Koeffizienten verwendet:

R = λ₁ ⋅ λ₂ – okay ⋅ (λ₁ + λ₂)² , wobei 0,04 ≤ okay ≤ 0,06

Basierend auf dem R-Wert können wir den Bildbereich klassifizieren:

  • R < 0 – Randbereich
  • R ~ 0 – flache Area
  • R > 0 – Eckbereich

OpenCV

Die Erkennung von Harris-Ecken kann mithilfe der Funktion cv2.CornerHarris problemlos in OpenCV implementiert werden. Sehen wir uns im folgenden Beispiel an, wie es gemacht werden kann.

Hier ist das Eingabebild, mit dem wir arbeiten werden:

Eingabebild

Lassen Sie uns zunächst die erforderlichen Bibliotheken importieren.

import numpy as np
import cv2
import matplotlib.pyplot as plt

Wir werden das Eingabebild in das Graustufenformat konvertieren, da der Harris-Detektor mit Pixelintensitäten arbeitet. Außerdem muss das Bildformat in float32 konvertiert werden, da die mit Pixeln verknüpften berechneten Werte die Grenzen (0, 255) überschreiten können.

path = 'information/enter/shapes.png'
picture = cv2.imread(path)
grayscale_image = cv2.cvtColor(picture, cv2.COLOR_BGR2GRAY)
grayscale_image = np.float32(grayscale_image)

Jetzt können wir den Harris-Filter anwenden. Der cv2.cornerHarris Die Funktion benötigt vier Parameter:

  • greyscale_image – Geben Sie ein Graustufenbild im Float32-Format ein.
  • Blockgröße (= 2) – definiert die Abmessungen des Pixelblocks in der Nachbarschaft des Zielpixels, der für die Eckenerkennung berücksichtigt wird.
  • ksize (= 3) – die Dimension des Sobel-Filters, der zur Berechnung von Ableitungen verwendet wird.
  • okay (= 0,04) – Koeffizient in der Formel zur Berechnung des Werts von R.
R = cv2.cornerHarris(grayscale_image, 2, 3, 0.04)
R = cv2.dilate(R, None)

Die Funktion cv2.cornerHarris gibt eine Matrix mit den exakten Abmessungen des ursprünglichen Graustufenbilds zurück. Seine Werte können deutlich außerhalb des normalen Bereichs (0, 255) liegen. Für jedes Pixel enthält diese Matrix den R-Koeffizientenwert, den wir oben betrachtet haben.

Der cv2.dilate ist ein morphologischer Operator, der elective unmittelbar danach verwendet werden kann, um die lokalen Ecken besser visuell zu gruppieren.

Eine gängige Technik besteht darin, einen Schwellenwert zu definieren, unterhalb dessen Pixel als Ecken betrachtet werden. Beispielsweise können wir alle Bildpixel als Ecken betrachten, deren R-Wert größer ist als der maximale globale R-Wert dividiert durch 100. In unserem Beispiel weisen wir solchen Pixeln die rote Farbe zu (0, 0, 255).

Um ein Bild zu visualisieren, müssen wir es in das RGB-Format konvertieren.

picture(R > 0.01 * R.max()) = (0, 0, 255)
image_rgb = cv2.cvtColor(picture, cv2.COLOR_BGR2RGB)

Schließlich verwenden wir Maplotlib, um das Ausgabebild anzuzeigen.

plt.determine(figsize=(10, 8))
plt.imshow(image_rgb)
plt.title('Harris Nook Detection')
plt.axis('off')
plt.tight_layout()
plt.present()

Hier ist das Ergebnis:

Ausgabebild. Rote Farbe kennzeichnet Ecken.

Abschluss

In diesem Artikel haben wir eine robuste Methode zur Bestimmung, ob es sich bei einem Bildbereich um eine Ecke handelt, untersucht. Die vorgestellte Formel zur Schätzung des R-Koeffizienten funktioniert in den allermeisten Fällen intestine.

Im wirklichen Leben besteht häufig die Notwendigkeit, einen Kantenklassifikator für ein gesamtes Bild auszuführen. Das Konstruieren einer Ellipse um die Gradientenpunkte und das jeweilsmalige Schätzen des R-Koeffizienten ist ressourcenintensiv. Daher werden fortschrittlichere Optimierungstechniken verwendet, um den Prozess zu beschleunigen. Dennoch basieren sie weitgehend auf der Instinct, die wir hier untersucht haben.

Ressourcen

Sofern nicht anders angegeben, stammen alle Bilder vom Autor.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert