在 jpg 文件中搜索一行 Python
Searching for a line in a jpg file Python
我对使用 Python 检测将扫描页面一分为二的垂直线很感兴趣。我有一系列这样的扫描页,我需要将它们沿着黑线分成两半。我知道如何使用 ImageMagick 拆分它们,我只需要能够检测到每张图像中位置略有不同(由于扫描)的线。我研究过使用 Hough 变换,但由于图像周围的所有文本,我无法让它工作。
我不能 post 图片,但你可以在这里找到一些:
https://drive.google.com/file/d/0B_6oYP6Nnjm4bFhYQzFSdnpPTTg/view?usp=sharing
https://drive.google.com/file/d/0B_6oYP6Nnjm4OGFQekM1SHBDN0E/view?usp=sharing
我会使用模板匹配之类的东西。您正在寻找的是被白色像素包围的黑色像素垂直条纹。在本地,图像应如下所示:
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)]
这种方法可以通过多种方式变得更加稳健:通过使用软模板,通过使用核密度估计器而不是直方图等。但在我的测试中,它工作得很好。
我对使用 Python 检测将扫描页面一分为二的垂直线很感兴趣。我有一系列这样的扫描页,我需要将它们沿着黑线分成两半。我知道如何使用 ImageMagick 拆分它们,我只需要能够检测到每张图像中位置略有不同(由于扫描)的线。我研究过使用 Hough 变换,但由于图像周围的所有文本,我无法让它工作。 我不能 post 图片,但你可以在这里找到一些: https://drive.google.com/file/d/0B_6oYP6Nnjm4bFhYQzFSdnpPTTg/view?usp=sharing https://drive.google.com/file/d/0B_6oYP6Nnjm4OGFQekM1SHBDN0E/view?usp=sharing
我会使用模板匹配之类的东西。您正在寻找的是被白色像素包围的黑色像素垂直条纹。在本地,图像应如下所示:
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)]
这种方法可以通过多种方式变得更加稳健:通过使用软模板,通过使用核密度估计器而不是直方图等。但在我的测试中,它工作得很好。