Sorunuzu bir 'yol optimizasyonu sorunu' olarak modelleyerek sorununuza alternatif bir çözüm burada. Basit binarizasyon ve sonra eğri uydurma çözümünden daha karmaşık olmasına rağmen, uygulamada daha sağlamdır.
Çok yüksek seviyeden, bu görüntüyü bir grafik olarak düşünmeliyiz,
her görüntü pikseli bu grafikteki bir düğümdür
her bir düğüm, komşu olarak bilinen diğer düğümlere bağlanır ve bu bağlantı tanımı genellikle bu grafiğin topolojisi olarak adlandırılır.
her düğümün, bu düğümün aradığımız en uygun merkez hatta olma olasılığını yansıtan bir ağırlığı (özellik, maliyet, enerji veya ne demek istersen) vardır.
Bu olasılığı modelleyebildiğimiz sürece, 'saçakların merkez çizgilerini' bulma probleminiz , grafik üzerinde , örneğin Viterbi algoritması gibi etkili bir şekilde çözülebilen yerel optimal yolları bulmak için soruna dönüşür .
İşte bu yaklaşımı benimsemenin bazı artıları:
tüm sonuçlarınız sürekli olacaktır (bir orta çizgiyi parçalara ayırabilecek eşik yönteminin aksine)
böyle bir grafik oluşturmak için birçok özgürlük, farklı özellikler ve grafik topolojisi seçebilirsiniz.
sonuçlarınız yol optimizasyonları açısından en uygunudur
çözümünüz gürültüye karşı daha sağlam olacaktır, çünkü gürültü tüm pikseller arasında eşit olarak dağıtıldığı sürece, bu optimum yollar sabit kalır.
İşte yukarıdaki fikrin kısa bir gösterimi. Nodların başlangıç ve bitiş neyin mümkün olduğunu belirtmek için önceden herhangi bir bilgi kullanmadığımdan, olası her başlangıç düğümünün wrt kodunu çözerim.
Bulanık sonlar için, olası her bitiş düğümü için en uygun yolları aradığımızdan kaynaklanır. Sonuç olarak, karanlık alanlarda bulunan bazı düğümler için, vurgulanan yol hala yerel optimal yoludur.
Bulanık yol için, bulduktan sonra düzeltebilir veya ham yoğunluk yerine bazı düzgünleştirilmiş özellikler kullanabilirsiniz.
Başlangıç ve bitiş düğümlerini değiştirerek kısmi yolları geri yüklemek mümkündür.
Bu istenmeyen yerel optimal yolları budamak zor olmayacaktır. Çünkü viterbi kod çözme işleminden sonra tüm yolların olasılığına sahibiz ve çeşitli ön bilgileri kullanabilirsiniz (örneğin, aynı kaynağı paylaşanlar için sadece tek bir optimal yola ihtiyacımız olduğunu doğru olarak görüyoruz.)
Daha fazla ayrıntı için makaleye bakabilirsiniz.
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.
Yukarıdaki grafiği yapmak için kullanılan kısa bir python kodu parçası.
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 ) );