Computer Vision: Wie kann man ein Bild horizontal mit der geringsten Entropie teilen?

9

Ich habe ein Bild mit Bereichen, die nicht weiß sind (z. B. Absatz, aber nicht mit OCR). Der Abstand zwischen diesen Regionen ist etwas regelmäßig, eine Person, die das Bild betrachtet, kann sehen, dass zwischen diesen Regionen weiße Räume sind.

Was ich vorhabe, ist, die oberen und unteren Ecken aller Regionen zu finden, von den unteren Ecken zu den oberen Ecken der nächsten Region zu gehen, die Entropie jeder horizontalen Linie und die Linie mit dem niedrigsten Wert zu nehmen und Y zurückzugeben Position.

%Vor%

Was ich vorhabe ist, diese Regionen auszuschneiden.

Ein anderer Ansatz, an den ich gedacht habe, war ein Histogramm, um die tiefsten Punkte zu identifizieren und irgendwie die Position des niedrigsten Balkens zu finden.

    
KJW 11.04.2013, 16:42
quelle

1 Antwort

4

Ich bin mir nicht sicher, ob es das ist, wonach du suchst (ich bin mir nicht sicher, was du suchst), also wenn ich falsch liege, schreibe bitte mehr Details und ich werde versuchen, meine Antwort zu aktualisieren. Gerade jetzt denke ich, dass Sie nach weißen Regionen suchen, die am besten für das Teilen von Papieren geeignet sind, weil Sie nichts Wichtiges schneiden.

Die am einfachsten zu implementierende Lösung ist nur die Summe jeder Zeile und der nächsten Zeile zu berechnen und zu überprüfen, ob die Differenz dieser Werte 0 (oder ein anderer kleiner Wert) ist. Hier ist ein einfacher Code:

%Vor%

In der Tat - Sie sollten auch überprüfen, ob diese Zeile weiß ist oder Sie haben gerade 2 sehr ähnliche nicht-weiße Zeilen gefunden - fügen Sie also einfach einen Test wie if ((int)s[0] < someValue) {//it's ok} else {//it's bad} zu diesem Code hinzu. Natürlich ist es keine sehr effiziente Lösung, weil Sie die Summe jeder (fast jeder) Reihe zweimal berechnen müssen und es Zeitverschwendung ist. Schnellere Lösung wird sein, sich die Summe der Zeile in der Variablen zu merken oder vielleicht sogar alle Summen in Vektor / Array / etc zu setzen, wenn Sie sie später verwenden wollen.

Der effizienteste Weg, dies zu berechnen, ist wahrscheinlich Integralbilder - Summe des Ganzen zu berechnen Image und dann subtract letzten Element von i row vom letzten Element von i+1 row. Natürlich sind integrale Bilder in openCV implementiert - siehe hier

    
cyriel 17.04.2013, 16:37
quelle

Tags und Links