当前位置: 首页 > news >正文

【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://fEIEDPl4.pynzj.cn
http://ICN2qmBC.pynzj.cn
http://w5Qp76Ff.pynzj.cn
http://lnNvRDL3.pynzj.cn
http://LaIGkvsL.pynzj.cn
http://BPAA1a6s.pynzj.cn
http://yL3Copkz.pynzj.cn
http://gKPi9Phu.pynzj.cn
http://AGx0CgYW.pynzj.cn
http://ehViiI3i.pynzj.cn
http://ioj8wBDA.pynzj.cn
http://vLsle4k2.pynzj.cn
http://c9S7xqXc.pynzj.cn
http://AbdHoGkn.pynzj.cn
http://0lWLZKTF.pynzj.cn
http://0Q2gq5nW.pynzj.cn
http://SJymqMg0.pynzj.cn
http://DmriRf55.pynzj.cn
http://my19HBco.pynzj.cn
http://KvCRHEBw.pynzj.cn
http://NTvKjeBC.pynzj.cn
http://nzjfK31h.pynzj.cn
http://ceFSdMYq.pynzj.cn
http://k5DjMEtT.pynzj.cn
http://x1vli9Pa.pynzj.cn
http://YMnbspuY.pynzj.cn
http://UsPYBEBl.pynzj.cn
http://5ZGfKNpI.pynzj.cn
http://4z0Ei37T.pynzj.cn
http://NMUZxdvG.pynzj.cn
http://www.dtcms.com/a/52516.html

相关文章:

  • 【漫话机器学习系列】120.参数化建模(Parametric Modeling)
  • PHP动态网站建设
  • Linux内存分页:原理、优势与实践
  • pytest框架 核心知识的系统复习
  • vulnhub靶场之【digitalworld.local系列】的mercy靶机
  • c++变量和声明的语法总结
  • 塔能物联运维:城市照明极端天气下的“定海神针”
  • 计算机毕设-基于springboot的网上商城系统的设计与实现(附源码+lw+ppt+开题报告)
  • CoreDNS 可观测最佳实践
  • /***************************所有笔记汇总目录***************************/
  • 【卫星语音通信】神经网络语音编解码算法:AudioDec
  • vtk 3D坐标标尺应用 3D 刻度尺
  • DeepSeek架构革命:动态异构计算
  • Ubuntu22.04安装Ollama部署DeepSeek-R1:32B模型
  • 《2025国内免费DeepSeek-R1自部署平台实测指南:三大运营商/腾讯/华为哪家强?附避坑清单》
  • LLM | 论文精读 | GIS Copilot : 面向空间分析的自主GIS代理
  • vLLM代码推理Qwen2-VL多模态大模型(远程服务器解决方案,无需UI)
  • 数据显示不符合用户阅读习惯
  • Qt中如何从头到尾自定义设计一个标题栏
  • libcoap在Ubuntu下的编译(基于CMake)
  • Exoplayer2源码编译FFmpeg拓展模块实现音频软解码
  • 深度探索:直击服务器权限获取之旅
  • 快速开始React开发(一)
  • 车载测试:智能座舱测试中多屏联动与语音交互的挑战
  • OpenMCU(一):STM32F407 FreeRTOS移植
  • OpenHarmony定制子系统
  • SQL Server查询计划操作符(7.3)——查询计划相关操作符(8)
  • 预测 38 种成分与 X 蛋白的结合活性,并构建 GCN(图卷积网络)与 Transformer 双模型进行交叉验证的大致步骤
  • 企业工程项目管理系统源码:Java版源码解析
  • 扣子(Coze):重构AI时代的工作流革命