Alternativen zur Hough-Transformation zur Erkennung einer gitterartigen Struktur

16

Ich habe ein Bild, das sich aus mehreren 'Winkeln' zusammensetzt, die eine Gitterform bilden:

Bildbeschreibung hier eingeben

Nach einigem Suchen schien Hough gut zu passen, da es nicht durch Zeilenumbrüche gestört wird. Das Problem ist jedoch, dass meine Linien "fett" sind und jede Kantenerkennung, die ich durchführe (in diesem Fall Canny), die Kanten der Linie und nicht die Mitte auswählt:

Bildbeschreibung hier eingeben

Dies bedeutet, dass die Hough-Transformation am Ende eine (oder beide) der "Seiten" meiner Gitterlinien auswählt und nicht die Mitte.

Bildbeschreibung hier eingeben

Angesichts der Tatsache, dass ich weiß, wonach ich suche (diese gitterartige Form, immer in ungefähr derselben Ausrichtung), gibt es eine bessere Möglichkeit, den Teil "Kantenerkennung" auszuführen, um mir die Mittellinien zu geben, oder sollte ich suchen auf eine ganz andere methode?

Benjol
quelle
Für den Kontext wird dieses Gitter mit einem nominalen Gitter verglichen, um eine Tsai-Kamerakalibrierung durchzuführen.
Benjol
"Kantenerkennung, die ich laufe, wählt die Kanten der Linie aus" Ja, weil die Kantenerkennung Kanten in Kanten konvertiert und Ihr Bild bereits Kanten enthält . Eine Kante ist eine Grenze zwischen hell und dunkel.
Endolith

Antworten:

10

Die Hough-Transformation würde in diesem Fall in der Tat helfen, das Gitter aufzunehmen. Wenn Sie die Linien "dünner" machen möchten, sollten Sie den Vorgang der Skelettierung in Betracht ziehen

Das würde ein Bild wie dieses ergeben: Ausgabe der Skelettierung

Aufgrund der Art und Weise, wie die Skelettierung funktioniert, werden dennoch einige Linien erzeugt, die für das Raster irrelevant erscheinen, aber diese Linien in Richtung "fehlerhafter" Richtungen sind nicht so zahlreich (zumindest in dem gegebenen Bild), dass sie die Linienerkennung der Hough-Transformation verwirren zu viel und es wird deutlich die beiden Hauptreihen in verschiedenen Richtungen auswählen. (So ​​sieht die HT-Ausgabe aus:) Bildbeschreibung hier eingeben

Wenn Sie MATLAB verwenden, möchten Sie vielleicht prüfen , diese Hilfeseite

A_A
quelle
Vielen Dank! Das hilft sehr. Ich habe noch keine MATLAB-Lizenz, aber ich habe sie mit AForge's SimpleSkeletonization ausprobiert und sie funktioniert besser ... Obwohl immer noch nicht perfekt. Ich werde dieses Thema später noch einmal aufgreifen, wenn ich einige echte Daten zum Testen bekomme.
Benjol
Möglicherweise möchten Sie zunächst versuchen, Ihr Originalbild an einer bestimmten Schwelle mit einem Schwellenwert zu versehen, bei der scheinbar "optimale" Fettgitterlinien erzeugt werden. Was ich unter optimal verstehe, ist, dass sie zumindest verbunden sind. Das könnte die Leistung der Skelettierung verbessern, aber Sie müssten einen zusätzlichen Parameter bestimmen (den Schwellenwert). Vielleicht lohnt es sich auch zu überlegen, wie Sie die Bilderfassung verbessern können.
A_A
ja, wie gesagt, wenn ich mit den realen Daten spielen kann, lohnt es sich, das System zu optimieren. Ein großer Zweifel, den ich an Hough im Allgemeinen habe, ist, dass die Diskretisierung von Theta gegen die von uns benötigte Subpixel-Präzision wirkt. (Das, und ich bin nicht ganz davon überzeugt, dass Linsenfehler nicht bedeuten, dass die Linien gekrümmt sein könnten , keine geraden ...)
Benjol
11

Eine Alternative zur Hough-Transformation wäre die Radon-Transformation ( 1 , 2 ). Eine grobe Beschreibung eines Algorithmus zum Erkennen einer gitterartigen Struktur könnte folgendermaßen aussehen:

1. Perform Radon Transform from 0 to 180 degrees.
2. Find the two highest maxima in the angle bins.
3. For the two angles with maximal amplitude find the local maxima within the bin.
4. You can use the constraint that the maxima should have even spacing to deal with outliers.

EDIT :

Hier ist ein kleines Matlab-Snippet zur Veranschaulichung von Schritt 1-3:

im = imread('grid.png');
[R, xp] = radon(im, 0:180);
imagesc(0:180, xp, R)

Ergebnis der Radontransformation

plot(max(R)) % the two maxima are at 65 & 117 degrees

Maxima über alle Winkel

plot(R(:, 65))

Maxima bei 65 Grad

plot(R(:,117))

Maxima bei 117 Grad

Um Ihre Frage aus den Kommentaren zu beantworten: Aus dem Beispielbild, das Sie zur Verfügung gestellt haben, geht hervor, dass diese Methode robuster gegenüber kleinen Fehlern im erkannten Gitter ist. Skelette ergeben selten gerade Linien, was für die nachfolgende Hough-Transformation von Nachteil sein könnte.

Björnz
quelle
Danke, können Sie mir in wenigen Worten sagen, welchen Vorteil die Radon-Transformation mir gegenüber der Hough-Transformation bringen würde?
Benjol
@benjol, ich habe meine Antwort aktualisiert.
bjoernz
Sehr schön, vielen Dank. Sobald es mir Zugang zu Matlab gibt, werde ich es versuchen!
Benjol