[模板匹配霍夫变换]——模板匹配分析、霍夫变换分析

article/2025/8/8 13:24:01

一、模板匹配分析

所谓模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最高的区域选择为最终的结果。

1、实现流程

(1)准备两副图像

  1. 原图像(I):在这幅图中,找到与模板相匹配的区域
  2. 模板(T):与原图像进行比对的图像块

(2)滑动模板图像和原图像进行比对

 (3)对于每一个位置将计算的相似结果保存在结果矩阵(R)中

(4)获得上述图像后,查找最大值所在的位置。

获得上述图像后,查找最大值所在的位置,那么该位置对应的区域就被认为是最匹配的。对应的区域就是以该点为定点,长宽和模板图像一样大小的矩阵。 

 2、API介绍

 3、简单案例

做一个梅西的模板,以梅西的脸部为模板,分别检测几种不同的检测方法

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('images/messi5.jpg', 0)
img2 = img.copy()
template = cv.imread('images/messi_face.jpg', 0)
w, h = template.shape[::-1]# All the 3 methods for comparison in a list
methods = ['cv.TM_CCOEFF', 'cv.TM_CCORR', 'cv.TM_SQDIFF']
for meth in methods:img = img2.copy()method = eval(meth)# Apply template Matchingres = cv.matchTemplate(img, template, method)min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimumif method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:top_left = min_locelse:top_left = max_locbottom_right = (top_left[0] + w, top_left[1] + h)cv.rectangle(img, top_left, bottom_right, 255, 2)plt.subplot(121), plt.imshow(res, cmap='gray')plt.title('Matching Result'), plt.xticks([]), plt.yticks([])plt.subplot(122), plt.imshow(img, cmap='gray')plt.title('Detected Point'), plt.xticks([]), plt.yticks([])plt.suptitle(meth)plt.show()

检测结果如下:

cv.TM_CCOEFF:

 cv.TM_CCORR:

 cv.TM_SQDIFF:

注: 可以看到使用cv.TM_CCORR的结果不如我们预期的那样好。

 与多个对象匹配的模板

在上面我们搜索了梅西的脸的图像,在图像中只出现了一次。假设您正在搜索一个多次出现的对 象,cv.minMaxLoc()不会给出所有的位置。在这种情况下,我们将使用阈值化。在这个例子中,我们将使用著名游戏马里奥的截图,我们将在其中找到硬币。

python  zip()函数:

  • zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
  • 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。zip(*loc[::-1])
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv.imread('images/mario.jpg')
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('images/coin.jpg', 0)
w, h = template.shape[::-1]
res = cv.matchTemplate(img_gray, template, cv.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv.imshow('res.png', img_rgb)
cv.waitKey(0)
cv.destroyAllWindows()

 二、霍夫变换分析

霍夫变换常用来提取图像中的直线和圆等几何形状,详情如下介绍:

 1、实现流程

假设有一个大小为100 * 100的图片,使用霍夫变换检测图片中的直线,则步骤如下所示:

 2、霍夫线检测

 霍夫线检测的整个流程如下图所示,这是在stackflow上一个关于霍夫线变换的解释:

(1) 简单使用

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from matplotlib import font_manager
#设置字体
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STHUPO.TTF")#1、加载图片,转换二值图
img = cv.imread("./images/feilin.jpg")
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 50, 100)#2、霍夫线变换
lines = cv.HoughLines(edges, 0.8, np.pi / 180, 150)#3、将检测到的线绘制在图像上(注意是极坐标)
for line in lines:rho, theta = line[0]a = np.cos(theta)b = np.sin(theta)x0 = a * rhoy0 = b * rhox1 = int(x0 + 1000 * (-b))y1 = int(y0 + 1000 * (a))x2 = int(x0 - 1000 * (-b))y2 = int(y0 - 1000 * (a))cv.line(img, (x1, y1), (x2, y2), (0, 255, 0))#4、图像显示
plt.figure(figsize=(10,8), dpi=100)
plt.imshow(img[:,:,::-1])
plt.title("霍夫变换线检测", fontproperties=my_font)
plt.xticks([]), plt.yticks([])
plt.show()

3、霍夫圆检测

 (1)API介绍

(2)简单使用

介绍:cv.circle(img,(520,430),300,(255,0,0),8)

  • 在img原始图片中划圈,其圈的中心点为(520,430),半径=300,颜色为(255,0,0),粗细=8
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from matplotlib import font_manager
#字体设置
my_font = font_manager.FontProperties(fname="C:/Windows/Fonts/STHUPO.TTF")#1、读取图像,并转换为灰度图
plants = cv.imread("./images/star.jpg")
gray_img = cv.cvtColor(plants, cv.COLOR_BGR2GRAY)#2、进行中值滤波,去除噪点
img = cv.medianBlur(gray_img, 7)#3、霍夫圆检测
circles = cv.HoughCircles(img, cv.HOUGH_GRADIENT, 1, 100, param1=100, param2=30, minRadius=0, maxRadius=100)#4、将检测结果绘制在图像上
for i in circles[0, :]: #遍历矩阵每一行的数据#绘制图形cv.circle(plants, (i[0], i[1]), i[2], (0,0,255), 2)#绘制圆心cv.circle(plants, (i[0], i[1]), 2, (0,0,255), 3)#5、图像显示
plt.figure(figsize=(10, 8), dpi=100)
plt.imshow(plants[:,:,::-1])
plt.title("霍夫变换圆检测", fontproperties=my_font)
plt.xticks([]),plt.yticks([])
plt.show()

 三、总结


http://chatgpt.dhexx.cn/article/lyK6fQqu.shtml

相关文章

计算机视觉学习第5章——多视图几何

目录 一、 外极几何 1.1 简单数据集 1.2 用Matplotlib绘制三维数据 1.3 计算F:八点法 1.4 外极点和外极线 二、照相机和三维结构的计算 2.1 三角部分 2.2 由三维点计算照相机矩阵 2.3 由基础矩阵计算照相机矩阵 三、多视图重建 3.1 稳健估计基础矩阵 …

Python计算机视觉——多视图几何

文章目录 第五章 多视图几何5.1 外极几何5.1.1 一个简单的数据集5.1.2 用Matplotlib绘制三维数据5.1.3 计算F:八点法5.1.4 外极点和外极线 5.2 照相机和三维结构的计算5.2.1 三角剖分5.2.2 由三维点计算照相机矩阵5.2.3 由基础矩阵计算照相机矩阵 5.3 多视图重建5.3…

curvelet变换的理解

一、matlab下curvelet工具包配置 首先在curvelet官方网站下载curvelet工具包,解压,其中包含了matlab与C语言两种实现的版本。 打开matlab,点击set path,选择“添加并包含子文件夹”,将有关的matlab代码,即…

java几何画板_geogebra几何画板下载

geogebra几何画板官方版是一款功能十分强大、非常专业的理科几何绘制工具,使用geogebra几何画板官方版您可以在上面画点、向量、线段、直线、多边形、圆锥曲线,甚至是函数以图像的形式呈现到您眼前。geogebra几何画板最新版是款非常不错的软件。 基本简介…

如何远程连接SQL Server数据库

一.设置客户端网络实用工具 点击“开始”-“程序”,在“Microsoft SQL Server”菜单中选择“客户端网络实用工具”。 在“别名”选项中点击“添加”。 在“服务器别名”中,填入您网站域名,在“网络库”区域中点击“TCP/IP”,在…

连接远程Mysql数据库

一、运行环境 数据库:Mysql 数据库所在系统:Linux(Ubuntu) IDE:PyCharm 测试环境:windows10 二、相关配置 1. 切换root用户权限 >> sudo -s2. 修改数据库配置 >> sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf #…

如何配置SQL Server数据库远程连接

本地数据库(SQL Server 2012或以上) 连接外网服务器的数据库,外网的服务器端需要做如下配置: 1、首先是要打开 数据的配置管理工具 2、配置相关的客户端协议,开启TCP/IP 3、数据库默认的远程端口是 1433(不…

远程连接服务器MySQL数据库

1.添加腾讯云安全组规则的MySQL 3306端口,设置相应的安全组规则。 规则设置,例如 2.参考另一篇博客。。。mysql数据库开启远程访问 设置完权限后 3.mysql配置my.cnf 是否不允许外网访问 [rootVM_71_45_centos ~]# vim /etc/my.cnf 找到里面bind-addre…

如何连接远程服务器上的数据库

远程服务器上切换root权限:sudo su root 远程服务器上检查防火墙是否对外开放3306端口:firewall-cmd --query-port3306/tcp 若为false则命令行开放端口:firewall-cmd --add-port3306/tcp 本地再次检查端口是否开放成功:telnet &l…

数据库远程连接

需求介绍 本地项目是SpringBoot项目要连接远程windows服务器上的mysql数据库。 实现步骤 1. 在windows服务器上下载与配置MySQL 1.1下载MySQL 可以在本地下载好后复制到远程服务器上,我是这样干的,服务器上下载太慢了 1.2配置MySQL 配置MySQL是为了…

远程连接sql数据库

[注] up使用sql 2012数据库较多,在这里就拿sql数据库来举例,其他的应该是类比。远程登录时建议使用sa登录,或者新建一个用户去登录sql(网站参考过一些博主,基本都是用sa或者其他用户名登录)。 1、sql数据的…

Mysql 连接远程数据库

一、改表 首先将mysql数据库中的user表中的数据看一下 select host,user from mysql.user; 可以看到root用户只允许localhost登录 我们需要更改一下 update mysql.user set host‘%’ where user‘root’; 更改好了之后再次查看发现已经变了,但是需要注意的是这种方…

java连接远程服务器上的数据库(MySQL)

1. 服务器上的准备工作 Linux服务器上下载并安装mysql服务 输入命令安装mysql服务:#yum install mysql-server即可联网安装mysql服务器输入指令开启mysql服务:#service mysqld start初始化mysql:#mysql_secure_installation接下来的一连串指令只要按照提示输入 y/n并且配置好密…

如何远程连接MySQL数据库

新安装的 MySQL 只有一个 root 用户,默认不开启远程连接。下面以 Ubuntu 系统下的 MySQL 为例,说明如何远程连接 MySQL 数据库。 登录 root 用户 mysql -uroot -pyongdu查看 mysql 数据库中的所有表 mysql> show databases; -------------------- |…

远程连接数据库

Windows系统(远程方) Windows系统功能 1. 启动telnet客户端 需要启动 telnet客户端( 安装完,最好重启电脑 ) telnet 连通性测试: Win r -> cmd -> Telnet www.baidu.com 80 回车后:出现…

远程连接SQL server 数据库

开发工具与关键技术: ssms SQL 作者:GuanLW 撰写时间:2022/3/28 第一步:打开电脑的防火墙,在高级设置里面添加入站和出站规则(控制面板>系统和安全>Windows defender防火墙>高级设置&#xff…

如何远程连接SQLServer数据库

如何远程连接SQLServer数据库 准备工作 1.打开 选中如下的连接方式 连接成功后就会出出现 2.连接成功后:右键设置属性 安全性设置:如下图所示 设置连接属性: 设置完成之后点击完成!!! 3.打开 启动sqlSe…

Java远程连接数据库——远程连接MySQL数据库,操作和管理MySQL数据库

目录 Java与MySQL 1.MySQL远程连接情况 1.1.查看权限情况 1.2.Java连接情况 2.MySQL远程连接设置 2.1.IP地址开放设置 2.2.开放3306端口 3.总结 Java与MySQL 上一篇笔记已经写好了MySQL的安装使用与Java连接MySQL的操作,但那仅仅是本地连接,我们都…

如何远程连接数据库

大家在本地连接自己的数据库可能没有问题,但当服务器的时候就需要远程连接了,那么如何能够让远程的数据库被我们访问到呢,接下来就具体执行一下相关的操作,以我的为例,连接虚拟机中的数据库,操作系统是linu…