Oto jeszcze alternatywne rozwiązanie problemu, modelując pytanie jako „problem optymalizacji ścieżki”. Chociaż jest to bardziej skomplikowane niż proste rozwiązanie do binaryzacji, a następnie dopasowania krzywej, w praktyce jest bardziej niezawodne.
Z bardzo wysokiego poziomu powinniśmy rozważyć ten obraz jako wykres, gdzie
każdy piksel obrazu jest węzłem na tym wykresie
każdy węzeł jest połączony z niektórymi innymi węzłami, znanymi jako sąsiedzi, a ta definicja połączenia jest często nazywana topologią tego wykresu.
każdy węzeł ma wagę (cechę, koszt, energię lub jakkolwiek chcesz to nazwać), odzwierciedlając prawdopodobieństwo, że ten węzeł znajduje się w optymalnej linii centralnej, której szukamy.
Tak długo, jak możemy modelować to prawdopodobieństwo, problem znalezienia „linii środkowych obrzeży” staje się problemem, aby znaleźć lokalne optymalne ścieżki na wykresie , które można skutecznie rozwiązać za pomocą programowania dynamicznego, np. Algorytmu Viterbi.
Oto niektóre zalety przyjęcia tego podejścia:
wszystkie wyniki będą ciągłe (w przeciwieństwie do metody progowej, która może rozbić jedną linię środkową na kawałki)
dużo swobody w tworzeniu takiego wykresu, możesz wybrać różne funkcje i topologię wykresu.
Twoje wyniki są optymalne w sensie optymalizacji ścieżek
Twoje rozwiązanie będzie bardziej odporne na zakłócenia, ponieważ dopóki szum jest równomiernie rozłożony na wszystkie piksele, te optymalne ścieżki pozostają stabilne.
Oto krótka prezentacja powyższego pomysłu. Ponieważ nie używam żadnej wcześniejszej wiedzy do określania możliwych węzłów początkowych i końcowych, po prostu dekoduję wrt każdy możliwy węzeł początkowy.
W przypadku rozmytych zakończeń jest to spowodowane tym, że szukamy optymalnych ścieżek dla każdego możliwego węzła końcowego. W rezultacie, chociaż dla niektórych węzłów znajdujących się w ciemnych obszarach, podświetlona ścieżka jest nadal lokalnie optymalna.
W przypadku rozmytej ścieżki można ją wygładzić po jej znalezieniu lub użyć wygładzonych funkcji zamiast surowej intensywności.
Możliwe jest przywrócenie ścieżek częściowych poprzez zmianę węzłów początkowych i końcowych.
Przycinanie tych niepożądanych lokalnych ścieżek optymalnych nie będzie trudne. Ponieważ mamy prawdopodobieństwo wszystkich ścieżek po dekodowaniu viterbi i możesz skorzystać z różnych wcześniejszych informacji (np. Widzimy, że prawdą jest, że potrzebujemy tylko jednej optymalnej ścieżki dla osób współużytkujących to samo źródło).
Aby uzyskać więcej informacji, możesz odwołać się do artykułu.
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.
Oto krótki fragment kodu python używanego do wykonania powyższego wykresu.
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 ) );