机器视觉初步7:模板匹配专题

news2024/12/23 8:37:01

今天端午,祝各位端午安康!
今天来说说模板匹配这个专题。

模板匹配(Template Matching)是一种图像处理技术,用于在一幅图像上查找与另一幅模板图像相同的区域。模板图像和待匹配图像的大小相同。模板匹配的目的是在待检测图像中找到与模板图像最匹配的区域。
在这里插入图片描述

在机器视觉中,模板匹配有以下应用:

  1. 目标定位:模板匹配可用来定位目标在图像中的位置。这可以帮助确定目标在图像中的尺寸、形状、位置等信息。
  2. 目标识别:模板匹配可用于识别不同的物体、人脸或其他特征,从而实现目标识别。
  3. 物体跟踪:模板匹配可用于跟踪移动物体,检测目标在图像中的变化,从而实现物体跟踪。
  4. 光学字符识别(OCR):模板匹配可用于检测待识别的文本区域,从而实现光学字符识别。

文章目录

  • 1. 均值漂移(Mean Shift):
  • 2. 最大值匹配(Maximum Mean Square Error,MMSE):
  • 3. 直方图匹配(Histogram Matching):
  • 4. Brute Force Matching(暴力匹配):

总之,模板匹配通常用于在一个图像中定位另一个图像的区域。常见的模板匹配方法有以下几种:

1. 均值漂移(Mean Shift):

均值漂移是一种基于局部极值的模板匹配方法。通过在搜索窗口中逐点计算梯度直方图,均值漂移会沿着梯度方向搜索,直到找到最大值。梯度直方图的峰值位置即为匹配的区域。
在这里插入图片描述

Python 实现:matplotlib 和 numpy

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

img = np.zeros((500, 500, 3), dtype=np.uint8)
template = np.zeros((100, 100, 3), dtype=np.uint8)

# 缩放模板
template = np.moveaxis(template, 1, 0)
template = np.moveaxis(template, 2, 0)

# 在图像上进行模板匹配
x_min, y_min, x_max, y_max = template.min(0), template.min(1), template.max(0), template.max(1)

def mean_shift(img, pattern, x, y, w, h):
    """
    在img图像上进行均值漂移
    :param img:
    :param pattern:
    :param x:
    :param y:
    :param w:
    :param h:
    :return:
    """
    diff = pattern - img
    diff = diff.reshape(w, h)
    diff = diff.T
    diff = diff[np.abs(diff).argmax(1)]

    return img + diff / (w * h)

img = mean_shift(img, template, x_min, y_min, 100, 100)

plt.imshow(img, cmap='gray')
plt.axis('off')
plt.show()

用halcon实现

dev_update_off ()
dev_close_window ()
read_image (Image, 'your_image_file')
get_image_size (Image, Width, Height)
dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowHandle)
dev_set_draw ('margin')
dev_set_color ('blue')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
MeanShift (Image, Region, 5, 'blue')
dev_display (Region)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()

2. 最大值匹配(Maximum Mean Square Error,MMSE):

最大值匹配是一种在图像中查找模板的方法,它将搜索窗口划分为多个相等的区域,并在每个区域内计算模板与区域内像素的差异。当差值的平方和最小时,找到最佳匹配区域。
Python 实现:numpy

import numpy as np

img = np.zeros((500, 500, 3), dtype=np.uint8)
template = np.zeros((100, 100, 3), dtype=np.uint8)

# 缩放模板
template = np.moveaxis(template, 1, 0)
template = np.moveaxis(template, 2, 0)

# 在图像上进行模板匹配
x_min, y_min, x_max, y_max = template.min(0), template.min(1), template.max(0), template.max(1)

def find_best_match(image, pattern):
    """
    在图像image中找到最匹配的区域
    :param image:
    :param pattern:
    :return:
    """
    match_areas = np.zeros(image.shape[:2], dtype=np.int32)

    for x_stride in range(0, image.shape[0], x_max):
        for y_stride in range(0, image.shape[1], y_max):
            match_area = ((x_max - x_min) * (y_max - y_min)) * (pattern == image[y_stride:y_stride + y_max, x_stride:x_stride + x_max])
            match_areas[y_stride + x_stride // x_max, x_stride + y_stride // y_max] = match_area

    best_match = np.argmax(match_areas)

    return best_match

img = find_best_match(img, template)

plt.imshow(img, cmap='gray')
plt.axis('off')
plt.show()

用halcon实现

dev_update_off ()
dev_close_window ()
read_image (Image, 'your_image_file')
dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowHandle)
dev_set_draw ('margin')
dev_set_color ('red')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
FindClosestPixel (Image, Region, [0 255 255], [0 255 255], 'max')
dev_display (Region)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()

3. 直方图匹配(Histogram Matching):

直方图匹配是一种基于局部直方图的模板匹配方法。它会对搜索窗口中的像素进行局部直方图计算,并与模板的直方图进行比较。当局部直方图与模板直方图之间的相似度最大时,找到最佳匹配区域。
在这里插入图片描述

Python 实现:skimage

import numpy as np
from skimage import measure, draw
from skimage.morphology import expand_edges

img = np.zeros((500, 500, 3), dtype=np.uint8)
template = np.zeros((100, 100, 3), dtype=np.uint8)

# 缩放模板
template = expand_edges(template, dim=2)
template = draw.rectangle(template, fill=0)

# 在图像上进行模板匹配
x_min, y_min, x_max, y_max = template.min(0), template.min(1), template.max(0), template.max(1)

def histogram_match(image, pattern):
    """
    在图像image中找到最匹配的区域
    :param image:
    :param pattern:
    :return:
    """
    match_areas = np.zeros(image.shape[:2], dtype=np.int32)

    for x_stride in range(0, image.shape[0], x_max):
        for y_stride in range(0, image.shape[1], y_max):
            match_area = ((x_max - x_min) * (y_max - y_min)) * (pattern == image[y_stride:y_stride + y_max, x_stride:x_stride + x_max])
            match_areas[y_stride + x_stride // x_max, x_stride + y_stride // y_max] = match_area

    best_match = np.argmax(match_areas)

    return best_match

img = histogram_match(img, template)

plt.imshow(img, cmap='gray')
plt.axis('off')
plt.show()

用halcon实现

4. Brute Force Matching(暴力匹配):

Brute Force Matching(暴力匹配)是一种简单的模板匹配方法,它通过计算模板与图像中每个像素的匹配程度来找到最佳匹配。暴力匹配的性能取决于匹配方法和图像本身的质量。
在这里插入图片描述

Python 实现:opencv

import cv2

# 读取图像
img = cv2.imread('input.jpg')
template = cv2.imread('template.jpg')

# 缩放模板
template = cv2.resize(template, (img.shape[1], img.shape[0]))

# 在图像上进行模板匹配
matches = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

# 计算匹配度
max_val, min_val, _, _ = cv2.minMaxLoc(matches)

# 找到最佳匹配区域
min_pt = min_val * img.shape[1]
max_pt = max_val * img.shape[1]

x_min = min_pt[0]
y_min = min_pt[1]
x_max = max_pt[0]
y_max = max_pt[1]

# 在图像上显示最佳匹配区域
cv2.rectangle(img, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)

# 显示最佳匹配区域
cv2.imshow('Match Results', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在实际应用中,根据图像的复杂程度、模板的大小和匹配方法的计算复杂度,可能需要选择合适的模板匹配方法。同时,为了提高匹配的准确性和鲁棒性,可以尝试使用多种匹配方法进行多次匹配,并从中选择最佳结果。
在计算机视觉中,模板匹配通常与其他计算机视觉技术(如特征提取和图像分割)一起使用,以实现更高级别的图像分析。以下是一些常见的计算机视觉应用:

  1. 目标跟踪:通过模板匹配找到目标物体在连续帧中的位置。这可以用于视频监控、智能交通系统等场景。
  2. 3D重建:通过在图像中找到匹配的区域,可以估计物体的3D形状。这对于虚拟现实、增强现实、机器人导航等领域非常有用。
  3. 图像分割:将图像分割成不同的区域,以便对每个区域进行特征提取、分类等操作。模板匹配可以帮助分割出感兴趣的物体或区域。
  4. 面部识别:在面部识别系统中,模板匹配可以用于检测和识别面部特征。这在安全监控、智能手机解锁等场景中有广泛应用。
  5. 物体识别:通过在图像中找到与模板相似的区域,可以实现物体识别。这对于自动驾驶、机器人视觉等领域非常有用。
  6. 运动分析:模板匹配可以用于分析运动物体在视频中的运动轨迹。这对于运动分析、视频监控等领域有重要作用。
  7. 光学字符识别(OCR):在OCR系统中,模板匹配可以帮助检测和定位文本区域。这对于自动文档处理、手写识别等应用场景非常有用。
    为了实现这些应用,模板匹配通常与其他计算机视觉技术相结合,如特征提取、图像分割、机器学习等。模板匹配可以作为一种基本的技术,用于实现更复杂的计算机视觉任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/673466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MongoDB大作业】MongoDB服务器的部署

【MongoDB大作业】MongoDB服务器的部署 作业要求作业步骤一、在VMware Workstations安装Linux操作系统(最小安装即可)二、安装完成后登录系统三、将ip地址设置为固定ip地址192.168.80.134四、设置虚拟网络编辑器五、使用 CRT 工具远程连接虚拟机六、下载…

《项目实战》构建SpringCloud alibaba项目(一、构建父工程、公共库、网关))

系列文章目录 构建SpringCloud alibaba项目(一、构建父工程、公共库、网关) 构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service) 文章目录 系列文章目录1、概要2、整体架构流程2.1、技术结构组成部分…

非监督学习

聚类Clustering 查看大量数据点,自动找到彼此相关或相似的数据点 K-means算法 原理 1.随机选择点,找聚类的中心位置。将点分配给簇质心 2.移动簇质心 不断重复这两个步骤 优化目标 成本函数失真函数distortion 在每次迭代中,失真成本…

极致呈现系列之:Echarts旭日图的绚丽奇观

目录 什么是旭日图旭日图的特性及应用场景旭日图的特性应用场景 旭日图常用的配置项创建基本的旭日图自定义旭日图样式样式旭日图的高级应用 什么是旭日图 旭日图是一种可视化图表,用于展示层级结构和层级之间的关系。它以一个圆形为基础,由多层的环形图…

【从零开始学习JAVA | 第七篇】API 简介

目录 前言 API介绍: 总结: 前言 这篇章为前导性文章,主要向大家介绍了什么是API,不要求掌握,感兴趣的小伙伴们可以看一看。 API介绍: API(Application Programming Interface)是指…

webpack原理之开发第一个loader

一. 搭建项目结构 整体项目结构如图: 1. 初始化包管理器package.json npm init -y 2. 打包入口文件src/main.js 3. 单页面入口public/index.html 4. 配置webpack.config.js const path require(path) const HtmlWebpackPlugin require("html-webpack-plu…

ChatBot聊天机器人学习1

1、Bot定义 能执行大量自动化、高速或机械式、繁琐的工作的计算机程序,包括但不仅限于聊天功能 2、Retrieval-based KE(知识网络)基于信息的提取。(检索的过程中有延迟,设置比较快捷的检索方式) 2.1 Int…

一看就懂的gulp操作指南:让前端工作变得更加轻松

文章目录 I. 简介什么是gulp为什么要使用gulp安装gulp II. Gulp入门任务(task)和流(stream)的概念使用gulp来处理文件基本的gulp任务(拷贝文件、压缩文件、编译Sass等) III. Gulp进阶使用插件开发面向生产的…

基于Python+tensorflow深度学习VGG-19图像风格迁移+自动去噪(MNIST数据集)机器学习+人工智能+神经网络——含全部Python工程源码

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境TensorFlow 环境 模块实现1. 图片处理2. 模型构造 系统测试工程源代码下载其它资料下载 前言 本项目基于 MNIST 数据集,使用 VGG-19 网络模型,将图像进行风格迁移,实现去噪功…

数字信号处理课程设计——调制与解调

文字目录 数字信号处理课程设计 摘要: 1绪论 1.1通信信号的调制与解调 1.2设计题目 2卷积定理和希尔伯特公式理论推导 2.1卷积定理 ​2.2希尔伯特公式 3信号DSB调制与希尔伯特解调 3.1过程框图 3.2相关理论推导 3.2.1卷积定理在调制中的应用 3.2.2希尔…

某马 qiankun 公开课 学习记录

端午早晨阳光正好,起来学习一小下 客观评价一哈:此视频适合不了解 qiankun 的朋友入门观看,更详细的使用方法还是推荐 qiankun 官网哦,老师讲的生动活泼,值得萌新一听 某马 qiankun 公开课 - bilibili ovo很多公司的…

高通Camera Log Debug 知识点

和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一、Camx UMD Log Debug二、Camx KMD log Debug三、常用缩写解释四、参考文献 一、Camx UMD Log Debug 1.1 两种方式设置camx UMD Log /vendor/etc/cam…

GPT-3.5眼中的编程语言之最:Python的卓越之处

当谈论编程语言的选择时,每个开发者都有自己的偏好和理由。作为GPT-3.5,以我的分析和学习能力,我也有自己心目中的编程语言之最。在众多编程语言中,Python在我的眼中独树一帜,是最令人着迷和受欢迎的编程语言之一。 首…

面试经典150题(1)

文章目录 前言除自身以外数组的乘积要求思路代码 跳跃游戏|要求题解代码 跳跃游戏||要求题解代码 前言 今天开始我将陆续为大家更新面试经典150题中较难理解的题目。今天我为大家分享的是,除自身以外数组的乘积、跳跃游戏| 和 跳跃游戏||。 除自身以外数组的乘积 …

【unity之UiI专题】GUI(IMGUI)详解

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

AI 绘画工具 Stable Diffusion 本地安装使用

最近要用到 AI 绘画,所以研究了下目前市面上的 AI 绘画工具,真可谓是琳琅满目,但主流的还是 Stable diffusion 和 Midjourney 两大阵营。 Midjourney 不多说,开箱即用,对新手非常友好,但不免费&#xff0c…

Linux基础(二)—— 怎么在VMware/WSL中安装Ubuntu系统

文章目录 01 | VMware安装Ubuntu02 | WSL2安装Ubuntu 虚拟机安装Linux的方式分为两种:APP安装、WSL安装 APP安装就是常见的VMware VirtualBox安装的方式,而WSL是Windows系统自带的一个虚拟机应用,可以更好的与Windows进行信息交互&#xff08…

判断是否为美丽数组

判断是否为美丽数组c思路和实现 这段代码的功能是对于给定的多个序列,判断每个序列是否是一个 beautiful 序列。没次读取当前的序列判断之后再加入下一个数字进序列。 首先,输入一个整数 t,表示测试数据组数。 对于每组测试数据,…

【初识C语言】字符串+转义字符+注释

文章目录 1. 字符串2. 转义字符转义字符表常见转义字符 3. 注释 1. 字符串 “hello world.\n” 上面这种由双引号引起的一串字符就被称为字符串; 字符串的存储 C 语言当中没有字符串类型,如果想要将字符串存储起来的话就需要用到字符串数组。 #include…

Excel VBA 编程入门

Visual Basic for Applications(VBA)是一种用于 Microsoft Office 套件中的编程语言,它可以帮助您自动化重复性任务、定制应用程序以及增强工作效率。本文将向您介绍 Excel VBA 编程的基础知识,并通过示例帮助您入门。 1、启用“开…