Inilah solusi alternatif untuk masalah Anda dengan memodelkan pertanyaan Anda sebagai 'masalah optimisasi jalur'. Meskipun lebih rumit daripada solusi binarization-dan-kemudian-kurva sederhana, itu lebih kuat dalam praktiknya.
Dari level yang sangat tinggi, kita harus mempertimbangkan gambar ini sebagai grafik, di mana
setiap piksel gambar adalah simpul pada grafik ini
setiap node terhubung ke beberapa node lain, yang dikenal sebagai tetangga, dan definisi koneksi ini sering disebut sebagai topologi dari grafik ini.
setiap node memiliki bobot (fitur, biaya, energi, atau apa pun yang Anda ingin menyebutnya), mencerminkan kemungkinan bahwa node ini berada di garis tengah optimal yang kami cari.
Selama kita dapat memodelkan kemungkinan ini, maka masalah Anda menemukan 'garis tengah pinggiran' menjadi masalah untuk menemukan jalur optimal lokal pada grafik , yang dapat secara efektif diselesaikan dengan pemrograman dinamis, misalnya algoritma Viterbi.
Berikut adalah beberapa pro mengadopsi pendekatan ini:
semua hasil Anda akan berkelanjutan (tidak seperti metode ambang batas yang mungkin memecah satu garis tengah menjadi beberapa bagian)
banyak kebebasan untuk membangun grafik seperti itu, Anda dapat memilih fitur yang berbeda, dan topologi grafik.
hasil Anda optimal dalam arti optimalisasi jalur
solusi Anda akan lebih kuat terhadap noise, karena selama noise terdistribusi secara merata di antara semua piksel, jalur optimal tersebut tetap stabil.
Berikut ini demonstrasi singkat dari ide di atas. Karena saya tidak menggunakan pengetahuan sebelumnya untuk menentukan apa yang mungkin dimulai dan diakhiri node, saya cukup mendekodekan setiap node awal yang mungkin.
Untuk akhiran fuzzy, ini disebabkan oleh fakta bahwa kami mencari jalur optimal untuk setiap simpul akhir yang mungkin. Akibatnya, meskipun untuk beberapa node yang terletak di daerah gelap, jalur yang disorot masih merupakan jalur lokal optimal.
Untuk jalur fuzzy, Anda bisa menghaluskannya setelah menemukannya atau menggunakan beberapa fitur yang dihaluskan alih-alih intensitas mentah.
Dimungkinkan untuk memulihkan jalur parsial dengan mengubah node awal dan akhir.
Tidak akan sulit untuk memangkas jalur optimal lokal yang tidak diinginkan ini. Karena kami memiliki kemungkinan semua jalur setelah decoding viterbi, dan Anda dapat menggunakan berbagai pengetahuan sebelumnya (misalnya kami melihat memang benar bahwa kami hanya memerlukan satu jalur optimal untuk mereka yang berbagi sumber yang sama.)
Untuk detail lebih lanjut, Anda bisa merujuk ke kertas.
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.
Berikut ini adalah potongan pendek kode python yang digunakan untuk membuat grafik di atas.
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 ) );