【计算机视觉算法与应用】模板匹配、图像配准

news/2025/3/14 1:18:55/

目录

1. 基于灰度值的模板匹配

2. 基于相关性的模板匹配

3. 基于形状的模板匹配

4. 基于组件的模板识别

5. 基于形变的模板匹配

6. 基于描述符的模板匹配

7. 基于点的模板匹配

性能比较


模板匹配的算法实现需要结合具体需求和应用场景来选择方法。以下是基于 OpenCV 的实现示例,用于实现以下模板匹配方法:

1. 基于灰度值的模板匹配

使用 OpenCV 的 cv2.matchTemplate 方法进行模板匹配。

import cv2
import numpy as np# 加载图像和模板
image = cv2.imread('image.jpg', 0)
template = cv2.imread('template.jpg', 0)
w, h = template.shape[::-1]# 匹配方法
result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)# 结果
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(image, top_left, bottom_right, 255, 2)
cv2.imshow('Matched Result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 基于相关性的模板匹配

相关性匹配也可以基于 cv2.matchTemplate,但使用不同的匹配模式。

result = cv2.matchTemplate(image, template, cv2.TM_CCORR_NORMED)
# 剩余代码与上面类似

3. 基于形状的模板匹配

使用 Canny 边缘检测和轮廓匹配。

# 提取轮廓
edges_image = cv2.Canny(image, 100, 200)
edges_template = cv2.Canny(template, 100, 200)# 轮廓匹配
contours_image, _ = cv2.findContours(edges_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours_template, _ = cv2.findContours(edges_template, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)similarity = cv2.matchShapes(contours_template[0], contours_image[0], cv2.CONTOURS_MATCH_I1, 0.0)
print(f"Shape Similarity: {similarity}")

4. 基于组件的模板识别

使用连通组件(Connected Components)。

# 连通组件
_, labels, stats, centroids = cv2.connectedComponentsWithStats(image, connectivity=8)# 遍历组件
for i in range(1, len(stats)):x, y, w, h, area = stats[i]if area > 50:  # 根据模板特性过滤cv2.rectangle(image, (x, y), (x + w, y + h), 255, 2)cv2.imshow('Components', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

5. 基于形变的模板匹配

形变模板匹配需要形变模型,比如 Thin Plate Splines 或其他变换。

from skimage.transform import warp
from skimage import data# 定义形变模型
def deform(image):# 示例:平移或旋转return warp(image, lambda xy: (xy[0] + 10, xy[1] + 10))transformed_template = deform(template)
result = cv2.matchTemplate(image, transformed_template, cv2.TM_CCOEFF_NORMED)

6. 基于描述符的模板匹配

使用 ORB 特征点和描述符。

# ORB 初始化
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(image, None)
kp2, des2 = orb.detectAndCompute(template, None)# 特征匹配
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)# 画出匹配结果
result = cv2.drawMatches(image, kp1, template, kp2, matches[:10], None, flags=2)
cv2.imshow('Descriptor Matching', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

7. 基于点的模板匹配

使用特征点检测方法,比如 FAST。

fast = cv2.FastFeatureDetector_create()
kp1 = fast.detect(image, None)
kp2 = fast.detect(template, None)# 可视化特征点
image_with_kp = cv2.drawKeypoints(image, kp1, None, color=(255, 0, 0))
template_with_kp = cv2.drawKeypoints(template, kp2, None, color=(255, 0, 0))cv2.imshow('Image Keypoints', image_with_kp)
cv2.imshow('Template Keypoints', template_with_kp)
cv2.waitKey(0)
cv2.destroyAllWindows()

性能比较

可以通过以下指标进行比较:

  1. 匹配时间:统计每种方法的运行时间。
  2. 准确性:计算匹配的正确率(例如 IoU 或精确定位的得分)。
  3. 鲁棒性:在旋转、缩放和噪声下的表现。

如需详细的性能比较,可以写一段代码封装测试和比较逻辑。需要时我可以帮助扩展测试脚本!

个人经验:

1. 工业场景几何关系明确,可以用 基于图像(相关性的就够了),测试显示,对

2. 形变,投影变换,可以考虑用特征点提取(ORB, SIFT)提取描述子, 配合匹配关系描述子配对关系计算获得。 c++ 中设计找最近点等优化算法,ranscac 去除异常点等手段。

3. 工业场景中,多用基于shape model 的查找。更稳定,速度更快(tamplate 小, 几十毫秒)

欢迎订阅本专辑,关注博主,持续更新 ~!code实战内容和经验!代码和理论即学即用!


http://www.ppmy.cn/news/1551305.html

相关文章

(Linux 系统)进程控制

目录 一、进程创建 1、fork函数初识 二、进程终止 1、正常终止 2、异常终止 三、进程等待 1、进程等待必要性 2、进程等待的方法: 四、获取子进程status 1、基本概念 2、进程的阻塞等待方式 3、进程的非阻塞等待方式 五、进程程序替换 1、六种替换函数…

Golang 构建学习

Golang 构建学习 如何搭建Golang开发环境 1. 下载GOlang包 https://golang.google.cn/dl/ 在地址上下载Golang 2. 配置包环境 修改全局环境变量,GOPROXY,GOPATH,GOROOT GOPROXYhttps://goproxy.cn,direct GOROOT"" // go二进…

GPT打字机效果—— fetchEventSouce进行sse流式请求

EventStream基本用法 与 WebSocket 不同的是,服务器发送事件是单向的。数据消息只能从服务端到发送到客户端(如用户的浏览器)。这使其成为不需要从客户端往服务器发送消息的情况下的最佳选择。 const evtSource new EventSource(“/api/v1/…

[OS] A4-前菜介绍

从你的描述来看,这段话是给你的一些 预备知识 和 mkfs工具的使用 提示,帮助你了解如何构建和管理文件系统,特别是关于 xv6 文件系统的一些基本操作。 我会通过比喻和通俗化的方式逐步解释: 预备知识:xv6 文件系统的基…

【GPT】为什么人需要睡觉?

睡觉对人类来说是至关重要的生理和心理需求。以下是一些为什么人需要睡觉的主要原因,以及睡眠对身体和大脑的影响: 1. 恢复与修复 身体修复:在睡眠期间,身体进行细胞修复和再生。例如,生长激素在深度睡眠中分泌&#…

JAVA面试题、八股文学习之JVM篇

1.什么是空闲列表? 空闲列表(Free List) 是一种内存管理技术,主要用于跟踪和管理堆内存中可用的空闲块。它广泛应用于各种内存分配算法中,特别是在 分段分配(Segmented Allocation) 和 链式分配…

【java-Neo4j 5进阶篇】- 1.批量新增数据

系列文章目录 之前的系列文章: 一、概述篇:https://blog.csdn.net/qq_40570699/article/details/143024984 二、入门篇:https://blog.csdn.net/qq_40570699/article/details/143905723 三、进阶篇: 1.批量导入数据 文章目录 系列文章目录需求场景一、解决思路二、代码1.将属性…

什么是Delta Lake(数据湖框架),以及Delta Lake特性和如何使用

文章目录 Delta Lake概念1、Delta Lake特性2、Delta Lake如何使用 Delta Lake概念 了解Delta Lake之前最好先去了解一下什么是数据湖,以及数据湖基于Hadoop、Spark的实现: 数据湖的概念(包含数据中台、数据湖、数据仓库、数据集市的区别)–…