Suche nach Quadraten im Bild

34

Ich muss die Quadrate in einem Bild mit OpenCV finden (kein Problem in Matlab oder einem anderen, im Allgemeinen, was ich erwarte, sind einige Ideen).

Betrachten Sie das Testbild unten:

Bildbeschreibung hier eingeben

Ich muss die farbigen Quadrate im obigen Bild genau finden (nicht die weißen langen Streifen).

Was habe ich getan :

  • Ich habe die übliche Methode angewendet (die mit OpenCV-Beispielen geliefert wird), dh Konturen in allen Farbebenen zu finden, diese zu approximieren und auf Anzahl der Elemente = 4 zu prüfen. Es funktioniert in gewissem Umfang, dass nur wenige Quadrate erkannt werden, insbesondere die dunklen.

  • Der nächste Schritt, den ich tat, war Vorhersage . dh diese Anordnung ist festgelegt . Wenn also einige erhalten werden, kann ich die verbleibenden vorhersagen. Es funktionierte auch ein bisschen weiter. Aber die Genauigkeit war sehr schlecht.

Ich bin jedoch der Meinung, dass Vorhersage keine gute Methode ist und nicht immer die richtigen Antworten liefert, die im ersten Schritt gegeben wurden.

Was ich brauche :

1) Gibt es andere bessere Methoden, um diese Quadrate genauer zu erkennen? Oder mehrere Methoden?

Ein wichtiger Punkt ist, dass Zeit hier kein Problem ist . Algorithmus kann langsam sein, egal. Genauigkeit ist jedoch das Hauptkriterium.

Manchmal können Bilder viel unscharfer sein.

Und eines der Hauptprobleme, mit denen ich konfrontiert war, war, dass einige Quadrate fast die gleiche Farbe wie der Hintergrund haben (siehe Spalte 3, erstes und zweites Quadrat).

Auf der Suche nach Ideen, danke im Voraus

UPDATE:

Unten ist das maximale genaue Ergebnis, das ich erhalten habe:

Bildbeschreibung hier eingeben

Natürlich wird das Ergebnisbild ein wenig verkleinert.

UPDATE 2:

Ich habe in meiner Antwort unten eine viel bessere Lösung angegeben: https://dsp.stackexchange.com/a/7526/818

Abid Rahman K
quelle
Ist dein Hintergrund immer weißlich?
1
Meine Idee war es, die "Sättigung" zu berechnen und den Schwellenwert für das Satellitenbild festzulegen, aber anhand Ihres Beispiels funktioniert dies nicht sehr gut (Berechnung der Sättigung als Maximum (RG, RB, GB). Die Tatsache, dass einige der Quadrate fast so aussehen wie der Hintergrund Wenn alle Ihre Bilder dasselbe Muster haben (lange weiße Streifen mit Quadraten daneben), sollten Sie in Betracht ziehen, die einfachsten Teile (z. B. die wirklich farbigen Quadrate oder die weißen Streifen) zu finden, um die mögliche Position für andere zu ermitteln Quadrate und ... finden Sie einen Weg, um zu überprüfen, ob sie wirklich da sind oder nicht. Stark, aber interessant! Können Sie mehr Bilder geben?
Nun, ich denke, das hätte nicht verschoben werden sollen.
Junuxx
1
Können Sie mehr Bilder zur Verfügung stellen? Was ist das für ein Ding?
Andrey Rubshtein
2
OP muss einige Fragen beantworten. Möglicherweise ist weißer Hintergrund nicht erforderlich. Und was ist los mit Licht? Wird es so schlimm sein? Diese sehen für mich nur unnötig komplex aus.
Tae-Sung Shin

Antworten:

9

Ein erster Versuch mit Matlab:

im = imread('squares.jpg');
im2 = rgb2gray(im);

se = strel('disk', 15);

for i = 1:16;
    t = 60+i*5; % try out a range of bw thresholds to see what works best
    labelled = bwlabel(im2>t); % label regions in the BW image
    closed = imclose(labelled, se); % close small regions
    cleared = imclearborder(~closed,4); % clear regions touching the border
    subplot(4,4,i); 
    imshow(cleared); 
    title(['T = ' num2str(t)]);
end

Ergebnisse in folgenden Regionen:

markierte Regionen

Wie Sie sehen, führt die Auswahl des Schwellenwerts, der die höchste Anzahl von Regionen ergibt (T = 120), bereits zu 7 korrekten Standorten, einigen zusammengeführten Standorten, einem falsch positiven und zwei falsch negativen.

Dies war ein ziemlich einfacher Versuch, aber ich denke, er zeigt, dass der Ansatz funktioniert. Ein paar Dinge hinzuzufügen, um verlängerte Bereiche aufzubrechen, oder dies für jeden Farbkanal einzeln zu tun, sind nur einige der Dinge, die Sie tun können, um dies zu verbessern.

Es wäre auch hilfreich, wenn Sie ein paar weitere Testbilder zur Verfügung stellen würden.

Junuxx
quelle
8

Ich hatte etwas anderes versucht, um mein fragliches Ergebnis zu verbessern. Die folgende Lösung geht davon aus, dass in Schritt 1 immer das erste Quadrat (Orange) erkannt wird. Dies ist aufgrund der kontrastreichen Farbe im Vergleich zum Hintergrund praktisch. Sogar das Ergebnis, das ich in Frage stellte, hat es richtig erkannt

Schritt 1: Finden Sie so viele Quadrate wie möglich

Ich habe das Bild in R-, G-, B-, H-, S- und V-Ebenen aufgeteilt und das Bild auf verschiedene Schwellenwerte wie ein Vielfaches von 25 begrenzt. Für jedes Bild habe ich Quadrate darin gefunden und sie auf ein "Maskenbild" gesetzt . Ich fand auch die durchschnittliche Höhe und Breite des Quadrats.

Maskenbild (Insgesamt 7/12 Felder erkannt):

Maskenbild

Schritt 2: Bilden Sie ein Quadratgitter

Als nächstes fand ich die Schwerpunkte dieser Quadrate in der Maske. Sortierte sie und fand den Schwerpunkt des ersten Quadrats (orange). Aus der genauen Analyse können wir erkennen, dass die Lücke zwischen zwei Quadraten sowohl in horizontaler als auch in vertikaler Richtung ein Quadrat ist. Auf diese Weise habe ich ein Gitter aus Quadraten wie folgt erstellt und es als ideal_squares bezeichnet (es ist nur ein Name, das heißt nicht, dass dies die Ausgabe ist, die ich benötige):

ideale_quadrate:

ideales Bild

Schritt 3: Ordnen Sie das Idealbild neu zu

Jetzt haben wir die idealen_Quadrat-Zentroide und die ursprünglichen Zentroide. Ich habe die richtigen Übereinstimmungen für jeden ursprünglichen Schwerpunkt aus ideal_centroids herausgefunden (indem ich den euklidischen Abstand zwischen ihnen genommen habe). Dann habe ich Scipy interpolate.griddata für die Interpolation und neu zugeordnet ideal_image gemäß den Schwerpunktwerten (es ist fast gleich wie in diesem Q & A getan Verziehen: Wie Konvexität Defekte in Sudoku - Quadrat entfernen und Bildtransformation in OpenCV ). Also unten ist die Ausgabe, die ich bekam:

Ausgabe :

Ausgabebild

Schritt 4: ODER über der Ausgabe mit dem Maskenbild aus dem ersten Schritt arbeiten

Endausgabe

Jetzt können Sie sehen, dass alle Quadrate erkannt wurden, jedoch mit einem der folgenden Probleme:

Problem :

Schauen Sie sich die Ausgabe von Schritt 3 an, dh das neu zugeordnete Bild des quadratischen Gitters. Mit Ausnahme von zwei zentralen Feldern werden alle anderen Felder abgeschnitten. Es ist ein Problem im Zusammenhang mit dieser Neuzuordnung. Ich bin nicht sicher, wo das Problem mit scipy.interpolate.griddata () oder cv2.remap () liegt. Ich dachte, das ganze Bild wird verzerrt sein, aber das ist es nicht. Es verzerrt nur das Bild innerhalb der von uns angegebenen Schwerpunkte. Wenn ich das korrigieren kann, ist die Ausgabe OK.

Also, wenn jemand eine gute Idee dafür kennt, herzlich willkommen !!!

Abid Rahman K
quelle
5

Hinweis: Diese Methode wird sehr langsam sein.

Erzeugen Sie eine Maske, die wie die Konturen eines idealen Objekts aussieht. Ähnlich wie dies:

Maske des Objekts

Schieben Sie dann die Maske über das Bild (Position, Skalierung, Drehung) und passen Sie sie an die Kontur des realen Bildes an (möglicherweise etwas unscharf, um eine weichere Reaktion zu erzielen), um zu berechnen, wie ähnlich sie sind (Position, Skalierung, Drehung) Die höchste Ähnlichkeitsreaktion sollte die (Position, Skalierung, Drehung) des realen Objekts sein.

Die Methode berücksichtigt keine Quadrate, die in den Hintergrund übergehen, oder sogar Teilverschlüsse des Objekts, da sie das gesamte Objekt berücksichtigt.

Ich persönlich habe diese Methode erfolgreich verwendet, um eine Mausschnauze und Schnurrhaare zu verfolgen, aber ich hatte einige Vermutungen, dass sie nahe an der letzten bekannten Position liegen des Objekts in der Kamera, wie weit von der Mitte entfernt sein kann, oder Drehung <10 Grad usw.

Dünner Jim
quelle
5

Schritt 1: Unabhängig davon, welches endgültige Binärbild Sie aus der Analyse in der B-, G-, R-, H-, S- und V-Ebene erhalten, führen Sie in diesem Bild einen Blob-Zählalgorithmus aus.

Schritt 2: Ermitteln Sie den größten Blob anhand der Fläche oder der Konturlänge. Da es sich bei Ihren Blobs hauptsächlich um Parallelogrammtypen handelt, also um Flächen oder Konturen, ist dies für alle möglich.

Schritt 3: Mit dem größten Blob (da der größte Blob der beste Blob ist, der Ihren Quadraten in der realen Welt ähnelt) versuchen Sie, die Ausrichtung des Blobs zu finden. Dies können Sie durch Anpassen eines am besten passenden Rechtecks ​​oder durch Erhalten der Eckpunkte erreichen ... erhalten die Neigung der Linien, die sie verbinden (sowohl in horizontaler als auch in vertikaler Richtung).

Schritt 4: Sobald Sie die beiden Steigungen erreicht haben, zeichnen Sie zwei Linien, die durch die Achse des Blobs verlaufen. Für die Achse können Sie die Eckpunkte mitteln oder den Schwerpunkt (Schwerpunkt) verwenden ... Ich würde mit dem Durchschnitt der Eckpunkte gehen ...

Schritt 5: Da in jeder horizontalen und vertikalen Richtung der Abstand gleich ist (idealerweise sind der horizontale und vertikale Abstand auch gleich, da er von Ihrem idealen quadratischen Bild herrührt, aber wir gehen nicht davon aus ..), müssen Sie nur die möglichen Schwerpunkte des anderen lokalisieren Parallelogramme

UNTERE LINIE: Wenn eines der Quadrate perfekt erkannt wird, können Sie das gesamte Raster erstellen . Halten Sie die Markierungsmittelpunkte in einem Abstand von 2H (H = horizontale Breite des größten Blobs) entlang der horizontalen Achse des größten Blobs und in einem Abstand von 2V (V = vertikale Höhe des größten Blobs) vertikal entlang der vertikalen Achse des Blobs.

Einige Bilder zum Unterstützen Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

rotierendes_Bild
quelle
1
+1 - Es wäre toll, wenn Sie es implementieren könnten.
Abid Rahman K
2
@AbidRahmanK Dafür ist StackExchange nicht gedacht. Frage -> Antwort. Andernfalls wäre dies eine Jobmesse.
Jan Krüger
2

Diese Anordnung ist festgelegt

Ich weiß nicht genau, was für eine Vorhersage Sie gemacht haben, aber Sie haben versucht, sich auf die weißen langen Streifen als Wurzel zu konzentrieren. Dann (wenn 3 Spalten mit Quadraten gleich groß sind) können Sie die Höhe eines Quadrats (Abstand zwischen den beiden Streifen) und den maximalen und minimalen Bereich (Höhe und Breite) im Bild ermitteln.

Versuchen Sie dann, die häufigste Farbe in Ihrem gesamten Quadrat zu ermitteln und sie auf einen "nicht quadratischen" Bereich festzulegen. Der Rest soll die Quadrate sein, die Sie suchen.


quelle
Ich habe 3-4 Quadrate mit der Konturmethode gefunden. Dann bekam Höhe und Breite jedes Quadrats. Dann wird die Lücke zwischen den erkannten Quadraten überprüft und angenommen, dass die Lücke zwischen ihnen groß genug ist, um ein weiteres Quadrat aufzunehmen. Das ist die Vorhersage, die ich gemacht habe.
Abid Rahman K
Einige Quadrate haben fast die gleiche Farbe wie der Hintergrund. Ich fürchte also, sie werden gemäß Ihrer Methode auch als nicht quadratische Fläche betrachtet.
Abid Rahman K
Vielleicht könnten Sie versuchen, an jeder Spalte eine Kurve zu zeichnen, bei der die x-Achse die Höhe (in Pixel) im Bild und die y-Achse die Intensität ist. Dann könnten Sie versuchen, einige Schneiden mit der abgeleiteten Form zu finden.
das ist die Kantenerkennung selbst, oder? Ich habe es versucht, aber kein gutes Ergebnis erzielt.
Abid Rahman K
1
Ja, aber Sie können selbst nachvollziehen, warum dies fehlschlägt, und möglicherweise einige interessante Regionen in der Handlung isolieren. Übrigens, wenn Sie hilfreiche Tipps zur Lösung Ihres Problems finden, posten Sie diese bitte. Viel Glück für Ihre Recherchen
0

Ich würde vorschlagen, die Hough-Transformation zu verwenden, die ein sehr robuster Algorithmus zum Auffinden einfacher parametrischer Formen ist, z. B. Linien, Kreise usw. Die Erkennung von Linien ist in Ihrem Fall am besten. Sie konnten die Seiten der langen weißen Streifen mindestens finden; dann könnten Sie mit jedem Eckenextraktionsalgorithmus (Harris oder vielleicht sogar SIFT oder SURF) Ecken entlang dieser Linien finden, selbst wenn Sie die Tatsache zugrunde legen, dass die Quadrate ungefähr gleich weit voneinander entfernt sind.

Canahari
quelle