这是通过将您的问题建模为“路径优化问题”来解决您的问题的替代解决方案。虽然它比简单的二值化然后曲线拟合解决方案更复杂,但它在实践中更加稳健。
从非常高的层次来看,我们应该将这张图片视为一个图形,其中
每个图像像素都是该图上的一个节点
每个节点都连接到其他一些节点,称为邻居,这种连接定义通常被称为该图的拓扑。
每个节点都有一个权重(特征、成本、能量或任何你想称之为的),反映了这个节点处于我们正在寻找的最优中心线的可能性。
只要我们可以对这种可能性进行建模,那么您寻找“边缘中心线”的问题就变成了在图上找到局部最优路径的问题,这可以通过动态规划(例如维特比算法)有效地解决。
以下是采用这种方法的一些优点:
您的所有结果都将是连续的(与可能将一条中心线分成几块的阈值方法不同)
构建这样的图有很多自由度,可以选择不同的特征,以及图拓扑。
从路径优化的角度来看,您的结果是最佳的
您的解决方案将对噪声更加稳健,因为只要噪声在所有像素之间均匀分布,这些最佳路径就会保持稳定。
这是上述想法的简短演示。由于我不使用任何先验知识来指定可能的起始节点和结束节点,因此我只是对每个可能的起始节点进行解码。
对于模糊结尾,这是由于我们正在为每个可能的结尾节点寻找最佳路径这一事实引起的。结果,尽管对于位于黑暗区域的某些节点,突出显示的路径仍然是其局部最优路径。
对于模糊路径,您可以在找到它之后对其进行平滑处理,或者使用一些平滑特征来代替原始强度。
可以通过更改起始节点和结束节点来恢复部分路径。
修剪这些不想要的局部最优路径并不难。因为我们有维特比解码后所有路径的可能性,并且您可以使用各种先验知识(例如,我们看到对于共享相同源的那些我们只需要一个最佳路径是真的。)
更多细节,你可以参考论文。
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.
这是用于制作上图的一小段 python 代码。
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 ) );