通过将问题建模为“路径优化问题”,这是您的问题的另一种解决方案。尽管它比简单的二值化然后弯曲的解决方案更为复杂,但在实践中却更为强大。
从非常高的层次来看,我们应该将此图像视为图形,其中
每个图像像素都是该图上的一个节点
每个节点都连接到其他一些节点(称为邻居),并且此连接定义通常称为此图的拓扑。
每个节点都有权重(功能,成本,能源或任何您想要称呼的权重),反映出该节点处于我们正在寻找的最佳中心线上的可能性。
只要我们可以对这种可能性进行建模,那么您找到“条纹的中心线”的问题就变成了在图形上找到局部最优路径的问题,这可以通过动态编程(例如维特比算法)有效地解决。
以下是采用这种方法的一些优点:
您的所有结果都是连续的(与阈值方法不同,阈值方法可能会将一条中心线弄成碎片)
构造此类图有很多自由度,可以选择不同的功能以及图拓扑。
在路径优化方面,您的结果是最佳的
您的解决方案将对噪声更具鲁棒性,因为只要噪声在所有像素之间平均分配,这些最佳路径便会保持稳定。
这是上述想法的简短演示。由于我不使用任何先验知识来指定可能的起始节点和结束节点,因此我仅对每个可能的起始节点进行解码。
对于模糊结局,是由于我们正在寻找每个可能的结局节点的最佳路径这一事实造成的。结果,尽管对于位于黑暗区域中的某些节点,突出显示的路径仍然是其局部最优路径。
对于模糊路径,可以在找到后对其进行平滑处理,也可以使用一些平滑后的特征代替原始强度。
通过更改起点和终点可以恢复部分路径。
修剪这些不需要的局部最优路径将很困难。因为在维特比解码之后,我们具有所有路径的可能性,并且您可能会使用各种先验知识(例如,我们看到,对于共享同一源的人,我们只需要一条最佳路径就可以了。)
有关更多详细信息,请参阅本文。
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 ) );