在jpg文件Python中搜索一行

时间:2015-05-26 17:32:36

标签: python image line ocr

我有兴趣使用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

1 个答案:

答案 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)]

这种方法可以通过多种方式变得更加健壮:使用软模板,使用核密度估计器而不是直方图等。但在我的测试中,这种方法运行良好。