अपने प्रश्न को 'पथ अनुकूलन समस्या' के रूप में बताकर यहां अभी तक आपकी समस्या का एक वैकल्पिक समाधान है। हालांकि यह सरल द्विप्रदीकरण-और-तब-क्यूरफिटिंग समाधान की तुलना में अधिक जटिल है, यह अभ्यास में अधिक मजबूत है।
बहुत उच्च स्तर से, हमें इस छवि को एक ग्राफ के रूप में मानना चाहिए, जहां
प्रत्येक चित्र पिक्सेल इस ग्राफ पर एक नोड है
प्रत्येक नोड को कुछ अन्य नोड्स से जोड़ा जाता है, जिन्हें पड़ोसियों के रूप में जाना जाता है, और इस कनेक्शन परिभाषा को अक्सर इस ग्राफ की टोपोलॉजी के रूप में संदर्भित किया जाता है।
प्रत्येक नोड में एक वजन (सुविधा, लागत, ऊर्जा, या जिसे आप इसे कॉल करना चाहते हैं) है, इस संभावना को दर्शाता है कि यह नोड एक इष्टतम केंद्रीय-रेखा में है जिसे हम खोज रहे हैं।
जब तक हम इस संभावना को मॉडल कर सकते हैं, तब तक center फ्रिंजेस की सेंटरलाइन्स ’को खोजने की आपकी समस्या ग्राफ पर स्थानीय इष्टतम रास्तों को खोजने के लिए समस्या बन जाती है , जिसे डायनेमिक प्रोग्रामिंग, जैसे वीटरबी एल्गोरिदम द्वारा प्रभावी रूप से हल किया जा सकता है।
इस दृष्टिकोण को अपनाने के कुछ नियम इस प्रकार हैं:
आपके सभी परिणाम निरंतर होंगे (दहलीज विधि के विपरीत जो एक केंद्र रेखा को टुकड़ों में तोड़ सकते हैं)
इस तरह के एक ग्राफ का निर्माण करने के लिए बहुत सारी स्वतंत्रता है, आप विभिन्न विशेषताओं, और ग्राफ टोपोलॉजी का चयन कर सकते हैं।
आपके परिणाम पथ अनुकूलन के अर्थ में इष्टतम हैं
आपका समाधान शोर के खिलाफ और अधिक मजबूत होगा, क्योंकि जब तक शोर सभी पिक्सेल के बीच समान रूप से वितरित किया जाता है, तब तक उन इष्टतम पथ स्थिर रहते हैं।
यहाँ उपरोक्त विचार का एक छोटा प्रदर्शन है। चूंकि मैं यह बताने के लिए किसी भी पूर्व ज्ञान का उपयोग नहीं करता कि क्या शुरू करना और नोड्स को समाप्त करना संभव है, इसलिए मैं बस हर संभव शुरुआती नोड को डीकोड करता हूं।
फजी एंडिंग के लिए, यह इस तथ्य के कारण होता है कि हम हर संभव समाप्ति नोड्स के लिए इष्टतम मार्ग ढूंढ रहे हैं। परिणामस्वरूप, हालांकि अंधेरे क्षेत्रों में स्थित कुछ नोड्स के लिए, हाइलाइट किया गया पथ अभी भी इसका स्थानीय इष्टतम है।
फ़ज़ी रास्ते के लिए, आप इसे ढूंढने के बाद या तो इसे चिकना कर सकते थे या कच्ची तीव्रता के बजाय कुछ चिकनी सुविधाओं का उपयोग कर सकते थे।
शुरू और समाप्त नोड्स को बदलकर आंशिक पथ को पुनर्स्थापित करना संभव है।
इन अवांछनीय स्थानीय इष्टतम रास्तों को चुभाना कठिन नहीं होगा। क्योंकि हमारे पास viterbi डिकोडिंग के बाद सभी रास्तों की संभावना है, और आप विभिन्न पूर्व ज्ञान का उपयोग कर सकते हैं (जैसे कि हम देखते हैं कि यह सच है कि हमें केवल उसी स्रोत को साझा करने वालों के लिए एक इष्टतम पथ की आवश्यकता है।)
अधिक जानकारी के लिए, आप कागज का संदर्भ ले सकते हैं।
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.
यहाँ उपरोक्त ग्राफ बनाने के लिए अजगर कोड का एक छोटा टुकड़ा दिया गया है।
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 ) );