我使用 opencv.TM_CCOEFF_NORMED 函数来匹配发票模板。但是,模板匹配功能并没有产生准确的结果。匹配准确率相当低,只有 50%。您能否建议我在流程中应包含或更改哪些内容以提高准确性?
templateMap = cv.matchTemplate(img_r, resized_template, cv.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(templateMap)
阈值 = 0.8
if max_val > threshold:
print(f"Template {template_name} found in {file_name}")
matched_files.append(file_name)
output_path = os.path.join(template_folder, os.path.basename(file_path))
imwrite(output_path, img)
。
请告诉我在模板匹配之前是否需要进行图像预处理,我应用了边缘检测。结果还是一样
OpenCV, EXpecting 增加 100%
。
当然,我可以帮助您提高使用 OpenCV 模板匹配的准确性。您是对的,预处理对于提高模板匹配的准确性至关重要。虽然边缘检测是一种预处理形式,但对于您的用例而言,它可能不是最有效的,而且它本身不太可能带来 100% 的准确率。
以下是您可以进行的一些改进:
-
理解模板匹配的局限性:模板匹配在处理图像大小、方向或视角的细微变化方面效果最佳。如果您的发票图像在这些方面差异很大,则模板匹配可能不是最佳方法。对于更复杂的情况,您可能需要更强大的方法,例如基于特征的匹配(ORB、SIFT)或深度学习目标检测模型(YOLO、Faster R-CNN)。
-
改进模板选择:
确保您的模板具有代表性且经过仔细裁剪:它应该只包含您要匹配的唯一元素,并尽可能减少背景干扰。
-
尝试不同的模板大小:如果您的发票图像的大小不同,请尝试使用多个大小的模板,或者使用调整大小技术。
-
增强预处理:
转换为灰度:模板匹配通常在灰度图像上效果更好,因为它降低了维度并对照明变化的敏感性降低。
均衡化直方图:这可以帮助标准化照明并提高对比度,从而实现更可靠的匹配。
消除噪点:使用高斯模糊或中值滤波器来消除噪点,这些噪点会影响匹配结果。
二值化:如果您的模板具有高对比度,请考虑使用自适应阈值来创建模板和搜索图像的二值化版本。这可以增强形状匹配。
-
试验匹配方法:
cv.TM_CCOEFF_NORMED
只是一个选项。其他方法,例如cv.TM_SQDIFF_NORMED
或cv.TM_CCORR_NORMED
,对于您的特定用例可能表现更好。尝试不同的方法来找到最有效的方法。 -
调整阈值:不要依赖于固定的阈值。根据您的预处理和匹配方法,您可能需要调整阈值以获得最佳结果。
以下是您的代码的改进版本,其中包含一些预处理步骤:
import cv2 as cv
import os
def match_template_in_image(image_path, template_image, threshold=0.8):
img_rgb = cv.imread(image_path)
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
# 预处理:应用高斯模糊进行降噪
blurred_img = cv.GaussianBlur(img_gray, (5, 5), 0)
# 预处理:均衡化直方图以提高对比度
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
equalized_img = clahe.apply(blurred_img)
# 使用预处理后的图像进行模板匹配
templateMap = cv.matchTemplate(equalized_img, template_image, cv.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(templateMap)
if max_val > threshold:
print(f"在 {image_path} 中找到了模板")
return True, max_loc, max_val
return False, None, None
# 使用示例
template_path = 'path_to_your_template.jpg'
template_image = cv.imread(template_path, cv.IMREAD_GRAYSCALE)
image_folder = 'path_to_your_images'
for filename in os.listdir(image_folder):
if filename.endswith(('.jpg', '.png')):
image_path = os.path.join(image_folder, filename)
is_matched, max_loc, max_val = match_template_in_image(image_path, template_image)
if is_matched:
print("最大值:", max_val)
# 在这里添加您想要对匹配的图像执行的代码
请记住,要获得最佳结果,您可能需要尝试不同的预处理技术、模板和参数。目标是找到适合您的特定用例的最佳组合。