Während des TeX-Stack-Austauschs haben wir diskutiert, wie "Flüsse" in Absätzen in dieser Frage erkannt werden können .
In diesem Zusammenhang sind Flüsse Leerräume, die sich aus der zufälligen Ausrichtung von Zwischenwörtern im Text ergeben. Da dies für einen Leser ziemlich ablenkend sein kann, werden schlechte Flüsse als Symptom für eine schlechte Typografie angesehen. Ein Beispiel für einen Text mit Flüssen ist dieser, bei dem zwei Flüsse diagonal fließen.
Es besteht ein Interesse daran, diese Flüsse automatisch zu erkennen, damit sie vermieden werden können (wahrscheinlich durch manuelle Bearbeitung des Textes). Raphink macht einige Fortschritte auf der TeX-Ebene (die nur Glyphenpositionen und Begrenzungsrahmen kennt), aber ich bin zuversichtlich, dass der beste Weg zum Erkennen von Flüssen eine Bildverarbeitung ist (da Glyphenformen sehr wichtig sind und TeX nicht zur Verfügung stehen). . Ich habe verschiedene Methoden ausprobiert, um die Flüsse aus dem obigen Bild zu extrahieren, aber meine einfache Idee, ein kleines Maß an ellipsoidaler Unschärfe anzuwenden, scheint nicht gut genug zu sein. Ich habe auch Radon probiertObwohl auf Transformationen basierendes Filtern, kam ich damit auch nicht weiter. Die Flüsse sind für die Funktionserkennungskreise des menschlichen Auges / der Netzhaut / des Gehirns sehr gut sichtbar, und irgendwie würde ich denken, dass dies in eine Art Filteroperation übersetzt werden könnte, aber ich bin nicht in der Lage, es zum Laufen zu bringen. Irgendwelche Ideen?
Um genau zu sein, suche ich nach einer Operation, die die beiden Flüsse im obigen Bild erkennt, aber nicht zu viele andere falsch positive Erkennungen aufweist.
BEARBEITEN: Endolith fragte, warum ich einen bildverarbeitungsbasierten Ansatz verfolge, da wir in TeX Zugriff auf die Glyphenpositionen, Abstände usw. haben und es möglicherweise viel schneller und zuverlässiger ist, einen Algorithmus zu verwenden, der den tatsächlichen Text untersucht. Mein Grund, Dinge anders zu machen, ist die FormDie Anzahl der Glyphen kann sich auf die Wahrnehmbarkeit eines Flusses auswirken. Auf Textebene ist es sehr schwierig, diese Form zu berücksichtigen (abhängig von der Schriftart, der Ligatur usw.). Betrachten Sie als Beispiel, wie wichtig die Form der Glyphen sein kann, die folgenden zwei Beispiele, bei denen der Unterschied darin besteht, dass ich einige Glyphen durch andere mit fast der gleichen Breite ersetzt habe, sodass eine textbasierte Analyse dies berücksichtigen würde sie gleich gut / schlecht. Beachten Sie jedoch, dass die Flüsse im ersten Beispiel viel schlechter sind als im zweiten.
quelle
ImageLines[]
Mathematica mit und ohne Vorverarbeitung verwendet. Ich denke, dies ist technisch eher eine Hough-Transformation als eine Radon-Transformation. Es wird mich nicht wundern, wenn die ordnungsgemäße Vorverarbeitung (ich habe den vom Datageist vorgeschlagenen Dilatationsfilter nicht ausprobiert) und / oder Parametereinstellungen dazu beitragen, dass dies funktioniert.Antworten:
Ich habe darüber noch etwas nachgedacht und denke, dass das Folgende ziemlich stabil sein sollte. Beachten Sie, dass ich mich auf morphologische Operationen beschränkt habe, da diese in jeder Standard-Bildverarbeitungsbibliothek verfügbar sein sollten.
(1) Öffnen Sie das Bild mit einer nPix-by-1-Maske, wobei nPix der vertikale Abstand zwischen Buchstaben ist
(2) Öffnen Sie das Bild mit einer 1-mal-mPix-Maske, um alles zu entfernen, was zu schmal ist, um ein Fluss zu sein.
(3) Entfernen Sie horizontale "Flüsse und Seen", die durch Abstände zwischen Absätzen oder Einrückungen entstehen. Dazu entfernen wir alle Zeilen, die alle wahr sind, und öffnen sie mit der nPix-by-1-Maske, von der wir wissen, dass sie die zuvor gefundenen Flüsse nicht beeinflusst.
Zum Entfernen von Seen können wir eine Öffnungsmaske verwenden, die etwas größer als nPix-by-nPix ist.
In diesem Schritt können wir auch alles wegwerfen, was zu klein ist, um ein echter Fluss zu sein, dh alles, was weniger Fläche als (nPix + 2) * (mPix + 2) * 4 abdeckt (das ergibt ~ 3 Linien). Die +2 ist da, weil wir wissen, dass alle Objekte mindestens nPix in der Höhe und mPix in der Breite haben, und wir wollen ein wenig darüber hinausgehen.
(4) Wenn wir nicht nur an der Länge, sondern auch an der Breite des Flusses interessiert sind, können wir Distanztransformation mit Skelett kombinieren.
(Farben entsprechen der Breite des Flusses (obwohl der Farbbalken um den Faktor 2 abweicht)
Jetzt können Sie die ungefähre Länge der Flüsse ermitteln, indem Sie die Anzahl der Pixel in jeder verbundenen Komponente und die durchschnittliche Breite durch Mitteln der Pixelwerte berechnen.
Hier ist genau die gleiche Analyse, die auf das zweite "No-River" -Bild angewendet wurde:
quelle
In Mathematica mit Erosion und Hough-Transformation:
Bearbeiten Sie den Kommentar von Beantwortung von Mr. Wizard
Wenn Sie die horizontalen Linien loswerden möchten, gehen Sie stattdessen wie folgt vor (wahrscheinlich könnte es jemand einfacher machen):
quelle
lines = ImageLines[ImageResize[#, {300, 300}], .6, "Segmented" -> True] & /@ i1;
. Trotzdem scheint ein morphologischer Ansatz für dieses Problem robuster zu sein.Hmmm ... Ich denke, Radon-Transformation ist nicht so einfach zu extrahieren. (Die Radon-Transformation dreht das Bild im Grunde genommen, während Sie es von der Kante aus "durchschauen". Dies ist das Prinzip von CAT-Scans.) Die Transformation Ihres Bildes erzeugt dieses Sinogramm, wobei die "Flüsse" helle Spitzen bilden, die eingekreist sind:
Die bei einer Drehung um 70 Grad ist ziemlich deutlich als die Spitze auf der linken Seite dieses Diagramms eines Schnitts entlang der horizontalen Achse zu sehen:
Vor allem, wenn der Text zuerst nach Gauß verschwommen war:
Ich bin mir jedoch nicht sicher, wie ich diese Peaks zuverlässig aus dem Rest des Rauschens extrahieren kann. Die hellen oberen und unteren Enden des Sinogramms stellen die "Flüsse" zwischen horizontalen Textzeilen dar, die Sie offensichtlich nicht interessieren. Vielleicht eine Gewichtungsfunktion gegen den Winkel, die mehr vertikale Linien betont und die horizontalen minimiert?
Eine einfache Cosinus-Gewichtungsfunktion funktioniert für dieses Bild gut:
Finden des vertikalen Flusses bei 90 Grad, welches das globale Maximum im Sinogramm ist:
und auf diesem Bild ist es genauer, wenn man das Bild bei 104 Grad findet, obwohl es zuerst verwischt wird:
(SciPys
radon()
Funktion ist irgendwie dumm , oder ich würde diesen Peak wieder als Linie durch die Mitte des Flusses auf das Originalbild abbilden.)Nach dem Verwischen und Gewichten wird jedoch keiner der beiden Hauptpeaks im Sinogramm für Ihr Bild gefunden:
Sie sind da, aber sie sind überwältigt von dem Zeug in der Nähe der mittleren Spitze der Wichtungsfunktion. Mit der richtigen Gewichtung und Tweaking wahrscheinlich diese Methode könnte funktionieren, aber ich bin nicht sicher , was die richtigen Kniffe sind. Dies hängt wahrscheinlich auch von den Eigenschaften der Scans der Seite ab. Vielleicht muss die Gewichtung von der Gesamtenergie in der Scheibe oder so etwas wie einer Normalisierung abgeleitet werden.
quelle
Ich habe einen Unterscheidungsklassifizierer für die Pixel unter Verwendung von abgeleiteten Merkmalen (bis zur 2. Ordnung) auf verschiedenen Skalen trainiert.
Meine Labels:
Vorhersage zum Trainingsbild:
Vorhersage auf den beiden anderen Bildern:
Ich denke, dies sieht vielversprechend aus und könnte bei mehr Trainingsdaten und vielleicht intelligenteren Funktionen zu brauchbaren Ergebnissen führen. Andererseits habe ich nur wenige Minuten gebraucht, um diese Ergebnisse zu erzielen. Sie können die Ergebnisse selbst reproduzieren, indem Sie die Open-Source-Software ilastik verwenden . [Haftungsausschluss: Ich bin einer der Hauptentwickler.]
quelle
(Dieser Beitrag enthält leider keine großartigen Demonstrationen.)
Wenn Sie mit Informationen arbeiten möchten, die TeX bereits hat (Buchstaben und Positionen), können Sie Buchstaben und Buchstabenpaare manuell als in die eine oder andere Richtung geneigt klassifizieren. Beispielsweise hat "w" SW- und SE-Eckneigungen, die "al" -Kombination hat eine NW-Eckneigung, "k" hat eine NE-Eckneigung. (Interpunktion nicht vergessen - ein Zitat, gefolgt von einem Buchstaben, der die untere Hälfte des Glyphenfelds ausfüllt, erzeugt eine schöne Steigung; Zitat gefolgt von q ist besonders stark.)
Suchen Sie dann nach Vorkommen entsprechender Steigungen auf gegenüberliegenden Seiten eines Raums - "w al" für einen Fluss von SW nach NE oder "k T" für einen Fluss von NW nach SE. Wenn Sie einen in einer Zeile finden, prüfen Sie, ob ein ähnlicher Fehler auftritt, der in den Zeilen darüber / darunter entsprechend nach links oder rechts verschoben ist. Wenn Sie einen Lauf von diesen finden, gibt es wahrscheinlich einen Fluss.
Achten Sie auch einfach auf fast senkrecht gestapelte Stellen, auf die senkrechten Flüsse.
Wenn Sie die "Stärke" des Abhangs messen, können Sie ein wenig differenzierter werden: Wie viel des Vorauskastens ist aufgrund des Abhangs "leer" und trägt somit zur Breite des Flusses bei. "w" ist ziemlich klein, da es nur eine kleine Ecke seines Vorschubkastens hat, um zum Fluss beizutragen, aber "V" ist sehr stark. "b" ist etwas stärker als "k"; Die sanftere Kurve sorgt für einen optisch kontinuierlichen Flussrand, der stärker und optisch breiter wird.
quelle