【CV001】归一化互相关模板匹配matlab实现

Normalized Cross-Correlation (NCC) 的原理

Normalized Cross-Correlation (NCC) 是一种衡量两个信号或图像之间相似度的度量方法。它在图像处理、计算机视觉和信号处理等领域应用广泛,特别是在模板匹配(template matching)中。NCC 的目标是比较两个信号的相似性,并通过一个标准化的度量值来表征其相似度。

具体来说,NCC 衡量的是一个信号或图像片段(如模板)在另一个信号或图像中的相似度,并且通过标准化消除了信号的绝对强度差异。

Normalized Cross-Correlation 计算公式

对于两个信号(或图像) ff 和 gg,它们的 normalized cross-correlation 定义如下:

N C C ( f , g ) = ∑ i , j ( f ( i , j ) − μ f ) ( g ( i , j ) − μ g ) ∑ i , j ( f ( i , j ) − μ f ) 2 ∑ i , j ( g ( i , j ) − μ g ) 2 NCC(f, g) = \frac{\sum_{i,j} (f(i,j) - \mu_f)(g(i,j) - \mu_g)}{\sqrt{\sum_{i,j} (f(i,j) - \mu_f)^2 \sum_{i,j} (g(i,j) - \mu_g)^2}} NCC(f,g)=i,j(f(i,j)μf)2i,j(g(i,j)μg)2 i,j(f(i,j)μf)(g(i,j)μg)

其中:

  • f ( i , j ) f(i,j) f(i,j) g ( i , j ) g(i,j) g(i,j) 分别是两个信号或图像在位置 ( i , j ) (i,j) (i,j) 处的值。
  • μ f \mu_f μf μ g \mu_g μg 分别是信号 f f f g g g 的均值(即平均值)。
  • 分子是信号 f f f g g g 之间的协方差。
  • 分母是标准差的乘积,用于标准化,确保 NCC 的结果在 [ − 1 , 1 ] [-1, 1] [1,1] 范围内。

对于模板匹配的场景,NCC 的输出范围是从 -1 到 1,其中:

  • N C C = 1 NCC = 1 NCC=1 表示完全匹配。
  • N C C = 0 NCC = 0 NCC=0 表示无相关性。
  • N C C = − 1 NCC = -1 NCC=1 表示完全反相关。

优缺点

优点:

  • 光照鲁棒性:归一化处理使其对光照变化不敏感。
  • 量化直观:结果范围固定( [ − 1 , 1 ] [-1, 1] [1,1]),易于设置阈值判断匹配质量。
  • 适用性广:可处理模糊图像、轻微形变及纹理丰富的场景。

缺点:

  • 计算复杂度高:传统方法在大型图像上速度慢,需依赖优化(如积分图、金字塔分层)提升效率。
  • 形变敏感:对旋转、缩放等几何变换适应性差,需结合特征点或尺度不变方法改进。
  • 局部最优陷阱:可能受噪声干扰陷入局部最优匹配。

NCC 模板匹配

目前网上的 NCC 实际上是 ZNCC。

Zero-normalized cross-correlation (ZNCC)
1 n ∑ x , y 1 σ f σ g ( f ( x , y ) − u f ) ( g ( x , y ) − u g ) \frac{1}{n} \sum_{x,y} \frac{1}{\sigma_f \sigma_g} \left( f(x,y) - u_f \right) \left( g(x,y) - u_g \right) n1x,yσfσg1(f(x,y)uf)(g(x,y)ug)

Normalized cross-correlation (NCC)
1 n ∑ x , y 1 σ f σ g f ( x , y ) g ( x , y ) \frac{1}{n} \sum_{x,y} \frac{1}{\sigma_f \sigma_g} f(x,y) g(x,y) n1x,yσfσg1f(x,y)g(x,y)

f f f 是参考图像, g g g 是浮动图像。一般参考图像的大小要大于浮动图像。

模板匹配的过程,类似于以浮动图像为卷积核,对参考图像进行卷积运算的过程。

每次运算,浮动图像都整体进行计算,因此其均值和标准差均为常数。而参考图像则是以浮动图像为核进行的卷积运算,每次运算参与计算的是参考图像与浮动图像重合的子图。

卷积运算的输出大小为 N f − N g + 1 N_f - N_g + 1 NfNg+1(即 valid 模式的卷积)。

在编程实现时,需要对 ZNCC 的公式进行化简:
1 n ∑ i ( f i − u f ) ( g i − u g ) = 1 n ∑ i ( f i g i − u g f i − u f g i + u f u g ) = 1 n ∑ i f i g i − u g ⋅ 1 n ∑ f i − u f ⋅ 1 n ∑ g i + u f u g = 1 n ∑ i f i g i − u f u g \begin{aligned} & \ \quad \frac{1}{n} \sum_i \left( f_i - u_f \right) \left( g_i - u_g \right) \\ &= \frac{1}{n} \sum_i \left( f_i g_i - u_g f_i - u_f g_i + u_f u_g \right) \\ &= \frac{1}{n} \sum_i f_i g_i - u_g \cdot \frac{1}{n} \sum f_i - u_f \cdot \frac{1}{n} \sum g_i + u_f u_g \\ &= \frac{1}{n} \sum_i f_i g_i - u_f u_g \end{aligned}  n1i(fiuf)(giug)=n1i(figiugfiufgi+ufug)=n1ifigiugn1fiufn1gi+ufug=n1ifigiufug
因此,ZNCC 与 NCC 存在转换关系:
ZNCC = NCC − u f u g σ f σ g \text{ZNCC} = \text{NCC} - \frac{u_f u_g}{\sigma_f \sigma_g} ZNCC=NCCσfσgufug
ZNCC 运算时域实现主要涉及三次卷积运算:

  • 计算 f 均值 E 矩阵
  • 计算 f 的二阶矩 E2 矩阵
  • 计算 f 与 g 的卷积

一般模板匹配的浮动图像较大,推荐在频域上进行实现。同时频域实现便于在频域上通过补零实现升采样以获取亚像素精度。

特别地,通过升采样获取亚像素精度,特别注意:当输入的参考图像存在极大值(远大于周围像素的值,均值矩阵在一个区域呈现为常量),插值的旁瓣影响可能被放大,得到的相关系数和偏移量可能不可靠,要谨慎采用!

Matlab 代码实现

hsCV.ncc 归一化互相关 matlab 实现版本,函数接口:

function [offset_x, offset_y, varargout] = ncc(ref_img, mov_img, varargin)
%hsCV.ncc 归一化互相关 matlab 实现版本
%
% Syntax:
%   [offset_x, offset_y] = hsCV.ncc(ref_img, mov_img [ ...
%               'ReferPadRadiusX', 0 ...
%               , 'ReferPadRadiusY', 0 ...
%               , 'EnableZero', true ...
%               , 'ResampleNum', 1]);
%   [offset_x, offset_y, output_option] = hsCV.ncc(___);
%   [offset_x, offset_y, response, max_rc] = hsCV.ncc(___);
%
% Params:
%   - refer_img        [required] [numeric; 2d] 参考图像, (补0后的参考图像大小应不小于浮动图像)
%   - move_img         [required] [numeric; 2d] 浮动图像
%   - ReferPadRadiusX  [namevalue] [numeric; scalar] 参考图像 x 方向两边填 0 的个数
%   - ReferPadRadiusY  [namevalue] [numeric; scalar] 参考图像 y 方向两边填 0 的个数
%   - EnableZero       [namevalue] [logical; scalar] 是否在相关运算中减去均值, 默认为true
%   - ResampleNum      [namevalue] [numeric; scalar] 重采样率, 大于 0 的整数
%
% Return:
%   - offset_x x方向偏移量, 相对于原图的左上角点
%   - offset_y y方向偏移量, 相对于原图的左上角点
%   - output_option 可选输出, 结构体
%       - m_response 响应值(重采样后)
%       - m_max_row 响应值最大值所在行(重采样后)
%       - m_max_col 响应值最大值所在列(重采样后)
%   - response 可选输出, 响应值(重采样后)
%   - max_rc 可选输出, 响应值最大值所在的行, 列% 完整版见下载链接: https://pan.quark.cn/s/ac25d60c3ca7
end

代码演示如下:
在这里插入图片描述

运行结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码下载:

网盘链接:https://pan.quark.cn/s/ac25d60c3ca7

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于DeepSeek实现PDF嵌入SVG图片无损放大

1. PDF中效果图 2. 询问Deepseek进行代码书写,不断优化后结果 /*** SVG工具类,用于生成价格趋势的SVG图表*/ public class SvgUtils {// SVG画布尺寸private static final int WIDTH 800;private static final int HEIGHT 500;private static final i…

linyu-im

linyu-mini-server&#xff1a;springboot vue mysql。一款非常漂亮的linyu-im&#xff0c;它的mini版本&#xff0c;仅使用了mysql数据库 1、数据库有sqlite和mysql&#xff0c;这里修改为mysql 2、User类的badge徽章字段中使用了JacksonTypeHandler转为字符串为List<S…

提升数据库性能与可靠性:深入解析MySQL主从复制

在当今数据驱动的世界中&#xff0c;无论是初创公司还是大型企业&#xff0c;都面临着如何高效管理和保护其宝贵数据的挑战。随着业务的增长和用户需求的增加&#xff0c;单点数据库往往难以承受日益增长的负载压力&#xff0c;这就需要一种更加灵活、可靠的解决方案来确保系统…

【CVPR2025】 EVSSM:用状态空间模型高效去模糊

Efficient Visual State Space Model for Image Deblurring 论文信息 题目&#xff1a; Efficient Visual State Space Model for Image Deblurring 用于图像去模糊的高效视觉状态空间模型 源码&#xff1a;https://github.com/kkkls/EVSSM 创新点 提出了高效视觉状态空间模型…

Ubuntu虚拟机中使用QEMU搭建ARM64环境

Ubuntu虚拟机中使用QEMU搭建ARM64环境 通过本实验学习如何编译一个 ARM64 版本的内核 image&#xff0c;并且在QEMU 上运行起来。 文章目录 Ubuntu虚拟机中使用QEMU搭建ARM64环境一、安装aarch64交叉编译工具二、安装QEMU三、制作根文件系统1、根文件系统简介2、BusyBox构建根…

SQL经典查询

查询不在表里的数据&#xff0c;一张学生表&#xff0c;一张学生的选课表&#xff0c;要求查出没有选课的学生&#xff1f; select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…

【神经网络】python实现神经网络(一)——数据集获取

一.概述 在文章【机器学习】一个例子带你了解神经网络是什么中&#xff0c;我们大致了解神经网络的正向信息传导、反向传导以及学习过程的大致流程&#xff0c;现在我们正式开始进行代码的实现&#xff0c;首先我们来实现第一步的运算过程模拟讲解&#xff1a;正向传导。本次代…

黑金风格人像静物户外旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 针对人像、静物以及户外旅拍照片&#xff0c;运用 Lightroom 软件进行风格化调色工作。旨在通过软件中的多种工具&#xff0c;如基本参数调整、HSL&#xff08;色相、饱和度、明亮度&#xff09;调整、曲线工具等改变照片原本的色彩、明度、对比度等属性&#xff0c;将…

Kubernetes中的 iptables 规则介绍

#作者&#xff1a;邓伟 文章目录 一、Kubernetes 网络模型概述二、iptables 基础知识三、Kubernetes 中的 iptables 应用四、查看和调试 iptables 规则五、总结 在 Kubernetes 集群中&#xff0c;iptables 是一个核心组件&#xff0c; 用于实现服务发现和网络策略。iptables 通…

C语言_数据结构总结5:顺序栈

纯C语言代码&#xff0c;不涉及C 想了解链式栈的实现&#xff0c;欢迎查看这篇文章&#xff1a;C语言_数据结构总结6&#xff1a;链式栈-CSDN博客 这里分享插入一下个人觉得很有用的习惯&#xff1a; 1. 就是遇到代码哪里不理解的&#xff0c;你就问豆包&#xff0c;C知道&a…

STM32之ADC

逐次逼近式ADC&#xff1a; 左边是8路输入通道&#xff0c;左下是地址锁存和译码&#xff0c;可将通道的地址锁存进ADDA&#xff0c;ADDB&#xff0c;ADDC类似38译码器的结构&#xff0c;ALE为锁存控制键&#xff0c;通道选择开关可控制选择单路或者多路通道&#xff0c;DAC为…

Magento2根据图片文件包导入产品图片

图片包给的图片文件是子产品的图片&#xff0c;如下图&#xff1a;A104255是主产品的sku <?php/*** 根据图片包导入产品图片&#xff0c;包含子产品和主产品* 子产品是作为主图&#xff0c;主产品是作为附加图片*/use Magento\Framework\App\Bootstrap;include(../app/boot…

初学STM32之简单认识IO口配置(学习笔记)

在使用51单片机的时候基本上不需要额外的配置IO&#xff0c;不过在使用特定的IO的时候需要额外的设计外围电路&#xff0c;比如PO口它是没有内置上拉电阻的。因此若想P0输出高电平&#xff0c;它就需要外接上拉电平。&#xff08;当然这不是说它输入不需要上拉电阻&#xff0c;…

图像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image

图像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image 文章目录 图像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image主要创新点模型架构图生成器生成器源码 判别器判别器源码 损失函数需要源码讲解的私信我 S…

STM32之I2C硬件外设

注意&#xff1a;硬件I2C的引脚是固定的 SDA和SCL都是复用到外部引脚。 SDA发送时数据寄存器的数据在数据移位寄存器空闲的状态下进入数据移位寄存器&#xff0c;此时会置状态寄存器的TXE为1&#xff0c;表示发送寄存器为空&#xff0c;然后往数据控制寄存器中一位一位的移送数…

Git - 补充工作中常用的一些命令

Git - 补充工作中常用的一些命令 1 一些场景1.1 场景11.2 场景21.3 场景31.4 场景41.5 场景51.6 场景61.7 场景71.8 场景81.9 场景91.10 场景101.11 场景111.12 场景121.13 场景131.14 场景141.15 场景15 2 git cherry-pick \<commit-hash\> 和 git checkout branch \-\-…

AI 驱动的软件测试革命:从自动化到智能化的进阶之路

&#x1f680;引言&#xff1a;软件测试的智能化转型浪潮 在数字化转型加速的今天&#xff0c;软件产品的迭代速度与复杂度呈指数级增长。传统软件测试依赖人工编写用例、执行测试的模式&#xff0c;已难以应对快速交付与高质量要求的双重挑战。人工智能技术的突破为测试领域注…

Unity--Cubism Live2D模型使用

了解LIVE2D在unity的使用--前提记录 了解各个组件的作用 Live2D Manuals & Tutorials 这些文件都是重要的控制动画参数的 Cubism Editor是编辑Live2D的工具&#xff0c;而导出的数据的类型&#xff0c;需要满足以上的条件 SDK中包含的Cubism的Importer会自动生成一个Pref…

Windows 系统 Docker Desktop 入门教程:从零开始掌握容器化技术

文章目录 前言一、Docker 简介二、Docker Desktop 安装2.1 系统要求2.2 安装步骤 三、Docker 基本概念四、Docker 常用命令五、实战&#xff1a;运行你的第一个容器5.1 拉取并运行 Nginx 容器5.2 查看容器日志5.3 停止并删除容器 六、总结 前言 随着云计算和微服务架构的普及&…

Lab17_ Blind SQL injection with out-of-band data exfiltration

文章目录 前言&#xff1a;进入实验室构造 payload 前言&#xff1a; 实验室标题为&#xff1a; 带外数据泄露的 SQL 盲注 简介&#xff1a; 本实验包含一个SQL盲目注入漏洞。应用程序使用跟踪Cookie进行分析&#xff0c;并执行包含提交的Cookie值的SQL查询。 SQL查询是异…