Hier finden Sie noch eine alternative Lösung für Ihr Problem, indem Sie Ihre Frage als 'Pfadoptimierungsproblem' modellieren. Es ist zwar komplizierter als die einfache Lösung zur Binarisierung und anschließenden Kurvenanpassung, in der Praxis jedoch robuster.
Von der sehr hohen Ebene aus sollten wir dieses Bild als Grafik betrachten, wo
Jedes Bildpixel ist ein Knoten in diesem Diagramm
Jeder Knoten ist mit einigen anderen Knoten verbunden, die als Nachbarn bezeichnet werden. Diese Verbindungsdefinition wird häufig als Topologie dieses Diagramms bezeichnet.
Jeder Knoten hat ein Gewicht (Feature, Kosten, Energie oder wie auch immer Sie es nennen möchten), was die Wahrscheinlichkeit widerspiegelt, dass sich dieser Knoten in einer optimalen Mittellinie befindet, nach der wir suchen.
Solange wir diese Wahrscheinlichkeit modellieren können, wird Ihr Problem, die "Mittellinien der Streifen" zu finden, zum Problem, lokale optimale Pfade auf dem Graphen zu finden , was durch dynamische Programmierung, z. B. Viterbi-Algorithmus, effektiv gelöst werden kann.
Hier sind einige Vorteile dieses Ansatzes:
Alle Ihre Ergebnisse sind kontinuierlich (im Gegensatz zu der Schwellenwertmethode, bei der eine Mittellinie in Stücke gebrochen werden kann).
Um ein solches Diagramm zu erstellen, haben Sie viele Freiheiten. Sie können verschiedene Features und Diagrammtopologien auswählen.
Ihre Ergebnisse sind optimal im Sinne von Pfadoptimierungen
Ihre Lösung ist robuster gegen Rauschen, da diese optimalen Pfade stabil bleiben, solange das Rauschen auf alle Pixel gleichmäßig verteilt ist.
Hier ist eine kurze Demonstration der obigen Idee. Da ich keine Vorkenntnisse verwende, um anzugeben, welche Start- und Endknoten möglich sind, decodiere ich einfach jeden möglichen Startknoten.
Für die Fuzzy-Endungen liegt es daran, dass wir für jeden möglichen Endknoten nach optimalen Wegen suchen. Infolgedessen ist der hervorgehobene Pfad für einige Knoten, die sich in dunklen Bereichen befinden, immer noch der lokal optimale Pfad.
Für den unscharfen Pfad können Sie ihn entweder glätten, nachdem Sie ihn gefunden haben, oder einige geglättete Features anstelle der Rohintensität verwenden.
Es ist möglich, Teilpfade wiederherzustellen, indem Start- und Endknoten geändert werden.
Es wird nicht schwierig sein, diese unerwünschten lokalen optimalen Pfade zu beschneiden. Da wir nach der Viterbi-Dekodierung die Wahrscheinlichkeit haben, dass alle Pfade vorhanden sind, und Sie möglicherweise verschiedene Vorkenntnisse verwenden (z. B. müssen wir für diejenigen, die dieselbe Quelle verwenden, nur einen optimalen Pfad angeben).
Weitere Informationen finden Sie auf dem Papier.
Wu, Y.; Zha, S.; Cao, H.; Liu, D., & Natarajan, P. (2014, February). A Markov Chain Line Segmentation Method for Text Recognition. In IS&T/SPIE 26th Annual Symposium on Electronic Imaging (DRR), pp. 90210C-90210C.
Hier ist ein kurzer Python-Code, mit dem das obige Diagramm erstellt wird.
import cv2
import numpy as np
from matplotlib import pyplot
# define your image path
image_path = ;
# read in an image
img = cv2.imread( image_path, 0 );
rgb = cv2.imread( image_path, -1 );
# some feature to reflect how likely a node is in an optimal path
img = cv2.equalizeHist( img ); # equalization
img = img - img.mean(); # substract DC
img_pmax = img.max(); # get brightest intensity
img_nmin = img.min(); # get darkest intensity
# express our preknowledge
img[ img > 0 ] *= +1.0 / img_pmax;
img[ img = 1 :
prev_idx = vt_path[ -1 ].astype('int');
vt_path.append( path_buffer[ prev_idx, time ] );
time -= 1;
vt_path.reverse();
vt_path = np.asarray( vt_path ).T;
# plot found optimal paths for every 7 of them
pyplot.imshow( rgb, 'jet' ),
for row in range( 0, h, 7 ) :
pyplot.hold(True), pyplot.plot( vt_path[row,:], c=np.random.rand(3,1), lw = 2 );
pyplot.xlim( ( 0, w ) );
pyplot.ylim( ( h, 0 ) );