我有兴趣使用Python来检测将扫描页面分成两部分的垂直线。我有一系列这些扫描页面,我需要将它们沿黑线分成两半。我知道如何使用ImageMagick分割它们,我只需要能够检测到每条图像中位置略有不同(由于扫描)。我已经研究过使用Hough变换,但由于图像周围的所有文本,我无法使其工作。 我无法发布图片,但你可以在这里找到一些: https://drive.google.com/file/d/0B_6oYP6Nnjm4bFhYQzFSdnpPTTg/view?usp=sharing https://drive.google.com/file/d/0B_6oYP6Nnjm4OGFQekM1SHBDN0E/view?usp=sharing
答案 0 :(得分:0)
我使用模板匹配之类的东西。您正在寻找的是由白色像素包围的黑色像素的垂直条纹。在本地,图像应如下所示:
1 1 0 1 1
1 1 0 1 1
1 1 0 1 1
因此,在您的图片上运行此模板,找到匹配的位置。
以下是我采取的步骤(使用scikit-image包):
0)(可选)通过提取中心周围的条带来缩小图像的大小。
1)定义模板:
pattern = np.tile(np.array([1,1,0,1,1]), (3, 1))
2)找到图像与图案类似的地方:
windows = skimage.util.view_as_windows(roi, pattern.shape)
diff = np.sum((windows - pattern)**2, axis=2).sum(axis=2)
3)现在定义一些阈值以确定位置是否匹配。我在这里使用0.5:
rows, cols = np.nonzero(diff < .5)
4)会有很多比赛,其中一些是假的,但绝大多数都是正确的。因此,形成一个直方图,找到条目数最多的bin:
counts, centers = np.histogram(cols, bins=40)
page_divider = centers[np.argmax(counts)]
这种方法可以通过多种方式变得更加健壮:使用软模板,使用核密度估计器而不是直方图等。但在我的测试中,这种方法运行良好。