首页 > 编程语言 >使用 opencv 实现模板匹配功能前的预处理要求

使用 opencv 实现模板匹配功能前的预处理要求

时间:2024-05-29 17:52:50浏览次数:17  
标签:python opencv image-processing python-imaging-library scikit-image

我使用 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% 的准确率。

以下是您可以进行的一些改进:

  1. 理解模板匹配的局限性:模板匹配在处理图像大小、方向或视角的细微变化方面效果最佳。如果您的发票图像在这些方面差异很大,则模板匹配可能不是最佳方法。对于更复杂的情况,您可能需要更强大的方法,例如基于特征的匹配(ORB、SIFT)或深度学习目标检测模型(YOLO、Faster R-CNN)。

  2. 改进模板选择:

  3. 确保您的模板具有代表性且经过仔细裁剪:它应该只包含您要匹配的唯一元素,并尽可能减少背景干扰。
  4. 尝试不同的模板大小:如果您的发票图像的大小不同,请尝试使用多个大小的模板,或者使用调整大小技术。

  5. 增强预处理:

    • 转换为灰度:模板匹配通常在灰度图像上效果更好,因为它降低了维度并对照明变化的敏感性降低。
    • 均衡化直方图:这可以帮助标准化照明并提高对比度,从而实现更可靠的匹配。
    • 消除噪点:使用高斯模糊或中值滤波器来消除噪点,这些噪点会影响匹配结果。
    • 二值化:如果您的模板具有高对比度,请考虑使用自适应阈值来创建模板和搜索图像的二值化版本。这可以增强形状匹配。
  6. 试验匹配方法:cv.TM_CCOEFF_NORMED 只是一个选项。其他方法,例如 cv.TM_SQDIFF_NORMEDcv.TM_CCORR_NORMED,对于您的特定用例可能表现更好。尝试不同的方法来找到最有效的方法。

  7. 调整阈值:不要依赖于固定的阈值。根据您的预处理和匹配方法,您可能需要调整阈值以获得最佳结果。

以下是您的代码的改进版本,其中包含一些预处理步骤:

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) 
            # 在这里添加您想要对匹配的图像执行的代码

请记住,要获得最佳结果,您可能需要尝试不同的预处理技术、模板和参数。目标是找到适合您的特定用例的最佳组合。

标签:python,opencv,image-processing,python-imaging-library,scikit-image
From: 78548353

相关文章

  • 用Python写一个热点事件追踪的算法
     要编写一个热点事件追踪的算法,首先需要明确算法的主要目标和所需的数据。在这个例子中,我们将基于微博的热度(如点赞数、转发数和评论数)来追踪热点事件。以下是一个简单的Python算法,仅供参考: 1.导入所需库 ```pythonimportrequestsfrombs4importBeautifulSoupimp......
  • Python截取函数
    在Python中,你可以使用切片(slice)来截取字符串、列表和其他序列类型的一部分。以下是一些常见的示例:1.**截取字符串**:```pythons="Hello,World!"substring=s[7:12] #从索引7开始到索引12(不包括12)结束print(substring) #输出:World```2.**使用负数索引截取**......
  • Python数据分析与挖掘实战(6章)
    非原创,仅个人关于《Python数据分析与挖掘实战》的学习笔记窃漏电数据分析导入相关库importwarningsimportmatplotlib.pyplotaspltimportnumpyasnpimportpandasaspdimportxlrd#解决中文乱码plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axe......
  • Python中的压缩和解包: '*'、'**'和zip()
    python中*用途广泛,除了在数学运算中作为相乘还可以在其它方便扮演者对数据的解包之用途。*数学运算中的相乘对元组/列表的解包1.星号*可以用于在解包过程中收集多余的值。例如:numbers=(1,2,3,4,5)#解包时使用*收集多余的值a,b,*rest=numbersprint(a)#......
  • Python实用代码片段分享(一)
    在Python编程的旅途中,我们经常会遇到各种问题和挑战。为了帮助大家更高效地编写代码,今天我为大家分享几个实用的Python代码片段。这些代码片段涵盖了从数据处理到文件操作,再到性能优化等多个方面。希望它们能在你的项目中发挥作用!一、数据处理1.列表推导式列表推导式是Pytho......
  • Python中的pyttsx3库:文本到语音转换的利器
    pyttsx3是一个跨平台的文本到语音转换库,它可以在没有安装其他依赖项的情况下在Windows、Linux和macOS上运行。pyttsx3使用系统自带的TTS(文本到语音)引擎,因此可以确保在各种操作系统上都具有较高的稳定性和可用性。官方文档:https://pyttsx3.readthedocs.io/en/latest/https://py......
  • python 基础习题4--分支结构
    1. 判断闰年,输入一个年份,判断该年份是否是闰年,闰年的判断规则如下:(1)能被4整除但不能被100整除的年份是闰年。(2)能被400整除的年份也是闰年。举例来说,2000年是闰年,因为它能被400整除,而1900年不是闰年,因为它能被4整除但却能被100整除。是闰年打印输出“yes”,否则......
  • Java语言,MySQL数据库;SSM 心理咨询预约管理系统19086(免费领源码)计算机毕业设计项目推荐
    目 录摘要1绪论1.1背景及意义1.2研究现状1.3ssm框架介绍1.4论文结构与章节安排2 心理咨询预约管理系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能......
  • 【SCAU操作系统】实验三单处理器系统的进程调度python源代码及实验报告参考
    一、课程设计目的        1.加深对进程概念的理解,明确进程和程序的区别。        2.深入了解系统如何组织进程、创建进程。        3.进一步认识如何实现处理器调度。二、课程设计内容        编写程序完成单处理器系......
  • python3.x中ORM框架SQLObject使用SQLite数据库随笔
    1、如果未安装SQLObject首先要安装,在管理员CMD下,输入如下命令:pipinstallsqlobject2、创建数据库文件,并建立数据库连接,通过修改SQLObject内置的sqlhub的processConnection属性,具体代码如下sqlobject.sqlhub.processConnection=sqlobject.connectionForURI('sqlite:.......