Robuste Erkennung von Rastermustern in einem Bild

9

Ich habe ein Programm in Python geschrieben, das automatisch Ergebnislisten wie dieses liest

Im Moment verwende ich die folgende grundlegende Strategie:

  • Verkleinern Sie das Bild mit ImageMagick
  • Lesen Sie Python mit PIL und konvertieren Sie das Bild in B & amp; W
  • Calculate berechnet die Summe der Pixel in den Zeilen und den Spalten
  • Finde Peaks in diesen Summen
  • Überprüfen Sie die Überschneidungen, die durch diese Spitzen für die Füllung angezeigt werden.

Das Ergebnis der Ausführung des Programms wird in diesem Bild gezeigt:

Sie können die Peak-Plots unterhalb und rechts neben dem Bild oben links sehen. Die Linien im oberen linken Bild sind die Positionen der Säulen und die roten Punkte zeigen die identifizierten Werte. Das Histogramm unten rechts zeigt die Füllstände jedes Kreises und die Klassifizierungslinie.

Das Problem mit dieser Methode besteht darin, dass eine sorgfältige Optimierung erforderlich ist und Unterschiede in den Scaneinstellungen auftreten. Gibt es einen robusteren Weg, das Gitter zu erkennen, das weniger A-priori-Informationen benötigt (im Moment verwende ich Wissen, wie viele Punkte es gibt) und ist robuster für Leute, die andere Formen auf die Blätter zeichnen? Ich glaube, dass es möglich sein kann, eine 2D-Fourier-Transformation zu verwenden, aber ich bin mir nicht sicher, wie.

Ich benutze die EPD, also habe ich einige Bibliotheken zur Verfügung.

    
chthonicdaemon 16.05.2013, 05:56
quelle

2 Antworten

2

Die korrekte Methode besteht darin, die Analyse Verbundener Komponenten im Bild zu verwenden, um sie in "Objekte" zu segmentieren. Dann können Sie höhere Algorithmen (z. B. Hough Transformation auf den Komponentenschwerpunkten) verwenden, um das Gitter zu erkennen und für jede Zelle zu bestimmen, ob es ein- / ausgeschaltet ist, indem Sie die Anzahl der aktiven Pixel betrachten.

    
Photon 16.05.2013 06:00
quelle
2

Zunächst finde ich Ihre anfängliche Methode ziemlich stichhaltig und ich hätte wahrscheinlich den gleichen Weg versucht (ich schätze besonders die Zeilen- / Spaltenprojektion, gefolgt von der Histogrammierung, die eine unterschätzte Methode ist, die normalerweise in realen Anwendungen ziemlich effizient ist) .

Da Sie jedoch eine robustere Verarbeitungspipeline verwenden möchten, finden Sie hier einen Vorschlag, der wahrscheinlich vollständig automatisiert werden kann (wobei gleichzeitig auch die Entzerrung über ImageMagick entfernt wird):

  1. Merkmalsextraktion: Extrahiere die Kreise über eine verallgemeinerte Hough-Transformation. Wie in anderen Antworten vorgeschlagen, können Sie den Python-Wrapper von OpenCV dafür verwenden. Der Detektor kann einige Kreise verpassen, aber das ist nicht wichtig.
  2. Wenden Sie einen robusten Ausrichtungsdetektor unter Verwendung der Kreismittelpunkte an. Sie können den Desloneux-Parameter-less-Detektor verwenden, der beschrieben wird hier . Haben Sie keine Angst vor der Mathematik, das Verfahren ist ziemlich einfach zu implementieren (und Sie können Beispielimplementierungen online finden).
  3. Entfernen Sie diagonale Linien durch eine Auswahl der Ausrichtung.
  4. Finde die Schnittpunkte der Linien, um die Punkte zu erhalten. Sie können diese Koordinaten zum Entzerren verwenden, indem Sie ideale feste Positionen für diese Schnittpunkte annehmen.

Diese Pipeline ist möglicherweise ein wenig CPU-intensiv (besonders Schritt 2, der zu einer Art gieriger Suche übergeht), sollte aber ziemlich robust und automatisch sein.

    
sansuiso 16.05.2013 07:12
quelle

Tags und Links