图片相似度计算-模板匹配
什么是模板匹配?
所谓模板匹配就是给出一个模板图片和一个搜索图片,在搜索图片中找到与模板图片最为相似的部分。
怎么实现?
简单来说,就是让模板图片在搜索图片上滑动,以像素点为单位,计算每一个位置上的相似度,最终得到相似度最高的像素点的位置,以该像素点为原定,模板图片为大小,对应在搜索图片上的位置即为匹配度最高的部分。
有哪些匹配算法?
在opencv中 可以通过函数matchTemplate实现模板匹配,同时有六种相关的匹配算法
T(x,y)T(x,y)T(x,y) 用来表示我们的模板。I(x,y)I(x,y)I(x,y) 是我们的目标图像 , R(x,y)R(x,y)R(x,y) 是用来描述相似度的函数。
平方差匹配 method=CV_TM_SQDIFF
这类方法利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大.
R(x,y)=∑x′,y′(T(x′,y′)−I(x+x′,y+y′))2R(x,y)= \sum _{x',y'} (T(x',y')-I(x+x',y+y'))^2R(x,y)=∑x′,y′(T(x′,y′)−I(x+x′,y+y′))2标准平方差匹配 method=CV_TM_SQDIFF_NORMED
这个方法其实和平方差匹配算法是类似的。只不过对图像和模板进行了标准化操作。
R(x,y)=∑x′,y′(T(x′,y′)−I(x+x′,y+y′))2∑x′,y′T(x′,y′)2⋅∑x′,y′I(x+x′,y+y′)2R(x,y)= \frac{\sum_{x',y'} (T(x',y')-I(x+x',y+y'))^2}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}R(x,y)=∑x′,y′T(x′,y′)2⋅∑x′,y′I(x+x′,y+y′)2∑x′,y′(T(x′,y′)−I(x+x′,y+y′))2相关匹配 method=CV_TM_CCORR
这类方法采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果.
R(x,y)=∑x′,y′(T(x′,y′)⋅I(x+x′,y+y′))R(x,y)= \sum _{x',y'} (T(x',y') \cdot I(x+x',y+y'))R(x,y)=∑x′,y′(T(x′,y′)⋅I(x+x′,y+y′))标准相关匹配 method=CV_TM_CCORR_NORMED
这个方法和 标准化差值平方和匹配 类似,都是去除了亮度线性变化对相似度计算的影响。可以保证图像和模板同时变亮或变暗k倍时结果不变。
R(x,y)=∑x′,y′(T(x′,y′)⋅I′(x+x′,y+y′))∑x′,y′T(x′,y′)2⋅∑x′,y′I(x+x′,y+y′)2R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I'(x+x',y+y'))}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}R(x,y)=∑x′,y′T(x′,y′)2⋅∑x′,y′I(x+x′,y+y′)2∑x′,y′(T(x′,y′)⋅I′(x+x′,y+y′))相关匹配 method=CV_TM_CCOEFF
这类方法将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列).
R(x,y)=∑x′,y′(T′(x′,y′)⋅I(x+x′,y+y′))R(x,y)= \sum _{x',y'} (T'(x',y') \cdot I(x+x',y+y'))R(x,y)=∑x′,y′(T′(x′,y′)⋅I(x+x′,y+y′))
在这里
T′(x′,y′)=T(x′,y′)−1/(w⋅h)⋅∑x′′,y′′T(x′′,y′′)I′(x+x′,y+y′)=I(x+x′,y+y′)−1/(w⋅h)⋅∑x′′,y′′I(x+x′′,y+y′′)\begin{array}{l} T'(x',y')=T(x',y') - 1/(w \cdot h) \cdot \sum _{x'',y''} T(x'',y'') \\ I'(x+x',y+y')=I(x+x',y+y') - 1/(w \cdot h) \cdot \sum _{x'',y''} I(x+x'',y+y'') \end{array}T′(x′,y′)=T(x′,y′)−1/(w⋅h)⋅∑x′′,y′′T(x′′,y′′)I′(x+x′,y+y′)=I(x+x′,y+y′)−1/(w⋅h)⋅∑x′′,y′′I(x+x′′,y+y′′)标准相关匹配 method=CV_TM_CCOEFF_NORMED
这是 OpenCV 支持的最复杂的一种相似度算法。这里的相关运算就是数理统计学科的相关系数计算方法。具体的说,就是在减去了各自的平均值之外,还要各自除以各自的方差。经过减去平均值和除以方差这么两步操作之后,无论是我们的待检图像还是模板都被标准化了,这样可以保证图像和模板分别改变光照亮不影响计算结果。计算出的相关系数被限制在了 -1 到 1 之间,1 表示完全相同,-1 表示两幅图像的亮度正好相反,0 表示两幅图像之间没有线性关系。
R(x,y)=∑x′,y′(T′(x′,y′)⋅I′(x+x′,y+y′))∑x′,y′T′(x′,y′)2⋅∑x′,y′I′(x+x′,y+y′)2R(x,y)= \frac{ \sum_{x',y'} (T'(x',y') \cdot I'(x+x',y+y')) }{ \sqrt{\sum_{x',y'}T'(x',y')^2 \cdot \sum_{x',y'} I'(x+x',y+y')^2} }R(x,y)=∑x′,y′T′(x′,y′)2⋅∑x′,y′I′(x+x′,y+y′)2∑x′,y′(T′(x′,y′)⋅I′(x+x′,y+y′))
通常,随着从简单的测量(平方差)到更复杂的测量(相关系数),我们可获得越来越准确的匹配(同时也意味着越来越大的计算代价). 最好的办法是对所有这些设置多做一些测试实验,以便为自己的应用选择同时兼顾速度和精度的最佳方案.
代码实现:
模板图片
搜索图片
代码:
import cv2
import numpy as np
def model_match(search_image, model_image, threshold):search_img = cv2.imread(search_image)model_img_gray = cv2.imread(model_image, 0)#读取模板图片的灰度图search_img_gray = cv2.cvtColor(search_img, cv2.COLOR_BGR2GRAY)#将搜索图片转化为灰度图h, w = model_img_gray.shaperes = cv2.matchTemplate(search_img_gray, model_img_gray, cv2.TM_CCOEFF_NORMED)#采用标准相关匹配 方法度量相似度print(res.shape)loc = np.where(res>threshold)#返回每一个维度的坐标值, 比如返回值为[1, 2, 3],[1, 2, 4] 表明(1, 1)(2, 2)(3, 4)这三个坐标点的相似度大于阈值print(loc)for pt in zip(*loc):#zip(*loc)反解析为坐标值print(pt)cv2.rectangle(search_img, pt[::-1], (pt[1] + w, pt[0] + h), (7,249,151), 2) #在搜索图片上绘制矩形框cv2.imshow('Detected',search_img) cv2.waitKey(0) cv2.destroyAllWindows()
if __name__ == "__main__":search_image = './data/car.jpg'model_image = './data/car_model.jpg'threshold = 0.95model_match(search_image, model_image, threshold)
最终效果
图片相似度计算-模板匹配相关推荐
- python 图像识别_python图像识别之图片相似度计算
作者 | a1131825850疯子 来源 | Python爬虫scrapy 原文 | python图像识别---------图片相似度计算 1.背景 要识别两张图片是否相似,首先我们可能会区分这两张 ...
- halcon 相似度_halcon模板匹配
在机器视觉应用中,经常需要对图像进行仿射变换. 1.在基于参考的视觉检测中,由于待检图像与参考图像或多或少都会存在几何变化(平移.旋转.缩放等),所以在做比较之前一般都要对待检图像进行仿射变换以对齐图 ...
- 图片相似度计算:深入理解DCT变换以及感知哈希
缘起 Android上硬件编解码一直是个老大难问题,就解码来说,硬解码本身并不困难,只要按照MediaCodec的流程开发即可.但由于系统碎片化,硬件规格不一致,硬件解码会到黑屏,花屏,绿屏之类的显示 ...
- 【python 以图搜图】三种图片相似度计算融合算法
目标:在一个文件夹找出相似度较高的图片,达到以图搜图的目的. 我找了十组,都是高度相似的图片. 核心算法: 1.分别自定义三种计算图片相似度算法,计算图片相似度算法ORB算法,以及局部敏感哈希phas ...
- Python图像识别,图片相似度计算!
1.背景 要识别两张图片是否相似,首先我们可能会区分这两张图是人物照,还是风景照等......对应的风景照是蓝天还是大海......做一系列的分类. 从机器学习的的角度来说,首先要提取图片的特征,将这 ...
- 连连看不一样的玩法,利用python进行图片相似度计算
先放制作好的游戏视频链接:(纯粹是兴趣分享) 连连看不一样的玩法-图像相似度识别-python_单机游戏热门视频 https://www.ixigua.com/7076826558106698253? ...
- python图像识别之图片相似度计算
作者 | a1131825850疯子 来源 | Python爬虫scrapy 1.背景 要识别两张图片是否相似,首先我们可能会区分这两张图是人物照,还是风景照等-对应的风景照是蓝天还是大海-做一系列 ...
- python相册图片处理_Python实现图片相似度计算
图片相似度 _ 概述 今天在用一个软件清理手机时,看到了一个比较好的功能:相似图片删除.软件识别出相册中类似的图片,删除相似图片,进而释放手机存储. 上网查了这个功能的基本实现算法,有挺多算法求图片相 ...
- python图片相似度计算_python Opencv计算图像相似度过程解析
这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.相关概念 一般我们人区分谁是谁 ...
- android 图片特征提取比对_计算机视觉 OpenCV Android | 基本特征检测 之 模板匹配...
模板匹配的 概述 以及 使用简介模板匹配是最简单的模式识别算法之一, 其在图像处理中经常用于从一副未知图像中, 根据预先定义好的模板图像来寻找与模板图像相同或者高度相似的子图像区域. 所以模板匹配需要 ...
最新文章
- 语义分割--Global Deconvolutional Networks for Semantic Segmentation
- 支付领域的未来与生物识别息息相关
- 注册中心 Eureka 源码解析 —— 应用实例注册发现(五)之过期
- ORA-00904: 标识符无效——解决方案
- JZOJ 5402. 【NOIP2017提高A组模拟10.8】God Knows
- 用matlab编程简单电子琴,基于MATLAB的数字信号发生器及简易电子琴设计论文.doc...
- 拦截器,过滤器,监听器原理
- 【Java】Java实现 JSON 的组装和解析
- sql语句--查询语句(MySQL)
- 代码实现sql编译器_【数据蒋堂】第 19 期:从 SQL 语法看集合化
- python 操作mongo
- C/C++ 指针详解
- python开发跟淘宝有联系没_Python爬取淘宝店铺和评论
- android执行lua脚本的方法,从Android应用程序调用Lua脚本
- java1.8 ojdbc14.jar_ojdbc14_g.jar与ojdbc14.jar区别
- Synergy让一个鼠标一个键盘操作多台电脑
- 计算广告系统算法与架构综述
- 体育会项目查询程序C语言,中考资讯:各地区2021年中考体育会取消吗
- CSS上下左右居中 阿星小栈
- 单位提前解除劳动关系怎么赔偿
热门文章
- android 常用图像密码,这几种Android图形密码最常用
- WS2812B全彩灯板
- 推荐一个GitHub项目!docker视频教程下载
- ubuntu16.04 更新pip
- 黄健计算机科学与技术学院,计算机科学与技术学院研究生学业奖学金初评结果汇总表...
- MySQL性能调优的10个方法
- 7.1立体环绕追踪音效|专属个性调音台,这副头戴电竞耳机有点料
- JS Learun 消息对话框
- 威联通212P 在admin用户密码正确情况下仍然无法登录WEB页面解决办法
- firefox使用掘金插件_谷歌浏览器常用插件