นี่คือวิธีการแก้ปัญหาทางเลือกของคุณโดยการสร้างแบบจำลองคำถามของคุณเป็น 'ปัญหาการเพิ่มประสิทธิภาพเส้นทาง' ถึงแม้ว่ามันจะซับซ้อนกว่าโซลูชันแบบไบนาไนเซชันและเส้นโค้งแบบง่าย ๆ แต่ก็มีความแข็งแกร่งในทางปฏิบัติ
จากระดับที่สูงมากเราควรพิจารณาภาพนี้เป็นกราฟ
แต่ละพิกเซลของรูปภาพเป็นโหนดบนกราฟนี้
แต่ละโหนดเชื่อมต่อกับโหนดอื่น ๆ ที่รู้จักกันในชื่อเพื่อนบ้านและคำจำกัดความการเชื่อมต่อนี้มักจะเรียกว่าโทโพโลยีของกราฟนี้
แต่ละโหนดมีน้ำหนัก (คุณสมบัติราคาพลังงานหรืออะไรก็ตามที่คุณต้องการเรียก) เพื่อสะท้อนถึงความเป็นไปได้ที่โหนดนี้อยู่ในสายกลางที่ดีที่สุดที่เรากำลังมองหา
ตราบใดที่เราสามารถสร้างแบบจำลองโอกาสนี้แล้วปัญหาของคุณในการค้นหา 'เส้นกลางของขอบ' กลายเป็นปัญหาเพื่อค้นหาเส้นทางที่เหมาะสมที่สุดในท้องถิ่นบนกราฟซึ่งสามารถแก้ไขได้อย่างมีประสิทธิภาพโดยการโปรแกรมแบบไดนามิกเช่นอัลกอริทึม Viterbi
นี่คือข้อดีของการใช้วิธีนี้:
ผลลัพธ์ทั้งหมดของคุณจะต่อเนื่อง (ซึ่งแตกต่างจากวิธีเกณฑ์ที่อาจแบ่งหนึ่งบรรทัดกลางเป็นชิ้น ๆ )
เสรีภาพมากมายในการสร้างกราฟเช่นนี้คุณสามารถเลือกคุณสมบัติที่แตกต่างกันและทอพอโลยีกราฟ
ผลลัพธ์ของคุณดีที่สุดในแง่ของการปรับเส้นทางให้เหมาะสม
โซลูชันของคุณจะทนทานต่อเสียงรบกวนได้มากขึ้นเพราะตราบใดที่เสียงรบกวนนั้นมีการกระจายอย่างเท่าเทียมกันในทุกพิกเซลเส้นทางที่เหมาะสมเหล่านั้นยังคงมีเสถียรภาพ
นี่คือการสาธิตสั้น ๆ ของความคิดข้างต้น เนื่องจากฉันไม่ใช้ความรู้ก่อนหน้าใด ๆ เพื่อระบุสิ่งที่เป็นไปได้เริ่มต้นและสิ้นสุดโหนดฉันก็ถอดรหัส wrt ทุกโหนดเริ่มต้นที่เป็นไปได้
สำหรับตอนจบที่เลือนมันเกิดจากความจริงที่ว่าเรากำลังมองหาเส้นทางที่ดีที่สุดสำหรับทุกโหนดสิ้นสุดที่เป็นไปได้ เป็นผลให้สำหรับบางโหนดที่อยู่ในพื้นที่มืดพา ธ ที่ไฮไลต์ยังคงเป็นโหนดที่ดีที่สุดในพื้นที่
สำหรับเส้นทางที่คลุมเครือคุณสามารถปรับให้เรียบหลังจากค้นหาหรือใช้คุณสมบัติที่ปรับให้เรียบแทนที่จะใช้ความเข้มแบบดิบ
เป็นไปได้ที่จะกู้คืนพา ธ บางส่วนโดยเปลี่ยนโหนดเริ่มต้นและสิ้นสุด
มันจะไม่ยากที่จะตัดเส้นทางที่ดีที่สุดในท้องถิ่นที่ไม่พึงประสงค์เหล่านี้ เนื่องจากเรามีความเป็นไปได้ของทุกเส้นทางหลังจากการถอดรหัส 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 ) );