所以我使用opencv来做模板匹配,如下所示。我经常需要修改视觉相似性#THRESHOLD
,因为它有时无法发现匹配,或者会返回太多的匹配。这是一个尝试和错误,直到它与文档中的一个位置中的一个元素完全匹配。我想知道是否有什么方法可以让这件事自动化。
image.png文件是pdf文档的图片。template.png文件是段落的图片。我的目标是发现pdf文档中的所有段落,我想知道什么神经网络在这里是有用的。
import cv2
import numpy as np
img = cv2.imread("image.png");
gimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
template = cv2.imread("template.png", cv2.IMREAD_GRAYSCALE);
w, h = template.shape[::-1]
result = cv2.matchTemplate(gimg, template, cv2.TM_CCOEFF_NORMED)
loc = np.where(result >= 0.36) #THRESHOLD
print(loc)
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0,255,0), 3)
cv2.imwrite("output.png", img)
例如,它将搜索从0
到1.0
的每个0
值,并返回一个阈值,该阈值返回图像中的单个矩形匹配(在上面绘制绿色框)。
然而,我不禁觉得这是非常令人兴奋的,或者有更明智的方法来找出阈值是什么?
发布于 2020-02-06 19:44:31
由于有很多评论,几乎没有任何回应,我将总结答案,供未来的读者。
首先,您的问题几乎与 如何为Python中不一致的文本结构检测文本文档图像中的段落完全相同。此外,这个线程似乎解决了您正在处理的问题:从图像中检测和裁剪文本块(段落)的简单方法?
第二,检测PDF中的段落不应该使用模板匹配的,而是使用以下方法之一:
任何OCR任务的关键是尽可能简化文本检测问题,通过根据需要修改图像来消除图像的破坏性特征。关于预先处理的图像的信息越多,越好:改变颜色,二值化,阈值,膨胀,应用过滤器等。
回答您的问题关于在模板匹配中找到最佳匹配的问题:签出关于模板匹配的答案。本质上,这取决于使用minMaxLoc找到最大相关值。以下摘自纳坦西的答案:
# Threshold resized image and apply template matching thresh = cv2.threshold(resized, 0, 255, cv2.THRESH\_BINARY\_INV + cv2.THRESH\_OTSU)[1] detected = cv2.matchTemplate(thresh, template, cv2.TM\_CCOEFF) (\_, max\_val, \_, max\_loc) = cv2.minMaxLoc(detected) ```
此外,可以在纳坦西在这条线上的回答中找到从图像中提取文本块的全面指南(不使用模板匹配)。
发布于 2020-02-06 17:09:08
我就会改变
loc = np.where(result == np.max(result))
这给了我最好的匹配位置,然后我只能选择一个,如果我想.
https://stackoverflow.com/questions/59923076
复制相似问题