我正在尝试使用模板匹配来查找从LaTeX生成的给定pdf文档中的公式。当我通过here使用代码时,当我从原始页面裁剪图片(转换为jpeg或png)时,我只得到非常好的匹配,但是当我单独编译方程代码并生成它的jpg/png输出时,匹配出错了。OpenCV中模板匹配的分辨率操作
我相信原因与分辨率有关,但由于我是该领域的业余爱好者,因此我无法合理地将生成的jpg从独立公式中生成为具有与整个页面相同的jpg像素结构。下面是被复制的代码(或多或少)从OpenCV中的上述网站,这对于蟒一个实现:
import cv2
from PIL import Image
img = cv2.imread('location of the original image', 0)
img2 = img.copy()
template = cv2.imread('location of the patch I look for',0)
w, h = template.shape[::-1]
# All the 6 methods for comparison in a list
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
method = eval(methods[0])
# Apply template Matching
res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
print top_left, bottom_right
img = Image.open('location of the original image')
#cropping the original image with the found coordinates to make a qualitative comparison
cropped = img.crop((top_left[0], top_left[1], bottom_right[0], bottom_right[1]))
cropped.save('location to save the cropped image using the coordinates found by template matching')
,以产生特定的独立方程的代码如下:
\documentclass[preview]{standalone}
\usepackage{amsmath}
\begin{document}\begin{align*}
(\mu_1+\mu_2)(\emptyset) = \mu_1(\emptyset) + \mu_2(\emptyset) = 0 + 0 =0
\label{eq_0}
\end{align*}
\end{document}
其中我编译和后面或者使用pdfcrop或使用图像配修剪方程周围的白色空间()方法在PythonMagick。在原始页面上使用此修剪输出生成的模板匹配没有给出合理的结果。这里是使用pdfcrop/Mac's Preview.app的修剪/转换输出:
直接从上面的页面中裁剪方程是完美的。我会感谢一些解释和帮助。
编辑: 我还发现它通过穷举可能的不同尺度使用模板匹配的情况如下: http://www.pyimagesearch.com/2015/01/26/multi-scale-template-matching-using-python-opencv/
但是因为我愿意尽可能多的处理如文件1000,这似乎是一个很慢的方法去。此外,我想应该有一个更合理的方式来处理它,通过某种方式找到相关的尺度。
非常感谢您的详细回复。我无法运行find_obj.py代码,因为它需要常用软件包,我无法找到它。但find_obj是否提供了包含较小图片的框的坐标?这对我来说是最重要的。 – Cupitor
@Cupitor示例本身并未在其周围放置一个框。但是由于在公式专用图像(仅限于图像边界)周围有方框,并且在大图像中有相应的点,因此可以通过计算由关键点匹配确定的变换矩阵和然后翘曲盒子。 –
@Cupitor公共包也在OpenCV的python示例目录中。但是我做了一个修改过的'find_obj.py'独立版本,它以红色绘制找到的公式的边界框。我将代码添加到我的答案中。 –