다음은 질문을 '경로 최적화 문제'로 모델링하여 문제에 대한 대안 솔루션입니다. 단순한 이진화 및 곡선 화 솔루션보다 더 복잡하지만 실제로는 더욱 강력합니다.
매우 높은 수준에서이 이미지를 그래프로 고려해야합니다. 여기서
각 이미지 픽셀은이 그래프의 노드입니다
각 노드는 이웃이라고 알려진 다른 노드에 연결되며이 연결 정의를 종종이 그래프의 토폴로지라고합니다.
각 노드에는 가중치 (기능, 비용, 에너지 또는 호출하려는 대상)가 있으며이 노드가 원하는 최적의 중심선에있을 가능성을 반영합니다.
이러한 가능성을 모형화 할 수있는 한, '프린지의 중심선'을 찾는 문제 는 그래프 에서 로컬 최적 경로 를 찾는 문제가되며 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 ) );