NCC归一化互相关(详解)

本文深入解析NCC(归一化互相关)在模板匹配中的应用,阐述其计算原理与公式,以及与相关系数和向量夹角的关系,帮助理解图像处理中的相似度度量。

NCC归一化互相关(详解)

NCC是什么

NCC(Normalized cross-correlation)是模板匹配中较为常见的互相关计算方法。
来描述两个同维向量,窗口或样本之间的相关性。其取值范围是-1~1,-1代表两向量不相关,1代表两向量相关

应用

NCC常做作为相似性的度量。当NCC为-1时,两向量负相关(你东我就西),当NCC为0时,两向量不相关(你东我随意),当NCC为1时,两向量正相关(你东我就东)。因此,NCC值越大,两向量越相似。反正不相似。

NCC的计算公式

NCC的计算公式网上有多种:

  1. https://blog.youkuaiyun.com/weixin_42104289/article/details/83088043
    在这里插入图片描述
  2. https://blog.youkuaiyun.com/jia20003/article/details/53021614在这里插入图片描述
  3. https://blog.youkuaiyun.com/qq_32261049/article/details/78666654
    在这里插入图片描述
  4. NCC 在这里插入图片描述

这些结果存在问题:

第一NCC这个叫法是有歧义的,特别是图像模板匹配领域的人,对NCC和ZNCC有区分,详情见 NCC与ZNCC。由于其存在多义性,本篇所说的NCC,以公式为其标识。

简约的计算公式

网上多数结果过于复杂,不好理解,简便而优美的公式见:
在这里插入图片描述
其中,f(),t(),为两个向量或样本,n为向量维数或窗口的大小,σ为各种样本的标准差,μ为各自样本的均值。

理解

NCC与相关系数

不难发现,NCC的计算公式与相关系数的计算公式一致,及:
在这里插入图片描述
在这里插入图片描述

相关系数就更好理解了,描述两样本的相关性,其实NCC就是计算两影像窗口内像素的相关系数。

NCC与向量夹角

另外NCC可以看作两个影像窗口内各像素组成的向量之间的夹角。详情见 NCC与ZNCC

<think>首先,用户的问题是:“我想查找ncc计算出inf的原因及解决办法 请问ncc计算结果为inf的原因及解决方法”。这翻译成英文是:“I want to find the reasons why NCC calculations result in inf and the solutions. Please explain the reasons and solutions for NCC calculation results being inf.” 用户提到了“inf”,这很可能指的是“infinity”,在计算中表示无穷大,通常出现在除以零或数值过大时。 现在,回顾系统指令: - 我必须使用$...$格式行内数学表达式,$$...$$格式独立公式。 - 语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,逐步解决问题。 - 参考用户上一次的问题和我的回答:用户上一次的问题是“参考站内引用:引用[1]:...引用[2]:...引用[3]:...引用[4]:.上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 用户提供了四个引用,但说这些不是真正的需求,我需要参考用户的实际问题。 用户的实际问题是关于NCC(Normalized Cross-Correlation)计算出现inf的原因和解决方法。NCC用于图像处理中的模板匹配,计算两个图像块的相关性。 关键点: - 在NCC计算中,公式涉及标准差和相关性计算。标准形式是: $$ \text{NCC}(u,v) = \frac{\sum_{x,y} (I(x,y) - \mu_I)(T(x-\Delta x, y-\Delta y) - \mu_T)}{\sigma_I \sigma_T} $$ 其中$\mu$是均值,$\sigma$是标准差。 - inf可能出现在分母为零时,即$\sigma_I$或$\sigma_T$为零。这发生在图像块完全均匀(恒定值)时,因为标准差为零。 常见原因: 1. **分母为零**:当图像块的标准差为零时,除以零导致inf。 2. **数值不稳定**:在计算中,如果值很小,浮点精度问题可能导致除以很小的数,接近机器零,从而产生inf。 3. **无效输入**:图像数据包含NaN或Inf值,传播到计算中。 4. **实现错误**:编程错误,如不正确的边界处理或数据类型。 解决方法: 1. **添加小常数**:在分母中添加一个小的epsilon值,例如$\epsilon = 10^{-10}$,以避免除以零。 2. **检查均匀块**:在计算前,检查图像块是否是常数块;如果是,跳过多点或设置默认值。 3. **使用替代方法**:如果NCC不适合,考虑其他相似性度量如SAD或SSD。 4. **预处理图像**:应用直方图均衡化或归一化来减少亮度变化影响。 5. **调试代码**:确保输入数据有效,无NaN或Inf。 参考用户提供的引用: - 引用[1]提到NCC对亮度变化不敏感,但计算量大。 - 引用[4]给出了SAD的实现伪代码,但NCC不同。 - 其他引用是关于SGBM算法等,不直接相关。 我需要整合这些,但用户说“上述引用仅供参考”,所以我应该专注于核心问题。 结构回答: - 逐步解释原因。 - 提供解决方法。 - 在结束时生成相关问题。 - 使用中文。 - 添加引用标识:既然用户提供了引用,我可以自然地引用[^1],[^2]等,但确保相关。例如,引用[1]讨论NCC,可以关联。 - 引用标识:[^1] for ref1, [^2] for ref2, etc. 最终回答结构: 1. **介绍**:简述NCC和问题。 2. **原因分析**:解释为什么出现inf。 3. **解决方法**:列出并解释。 4. **总结**。 5. **相关问题**:生成2-3个相关问题。 生成相关问题: 1. 如何处理图像块标准差为零的情况? 2. NCC计算中的数值优化有哪些技巧? 3. 在深度学习中,如何避免相似性计算中的数值不稳定问题? </think>### NCC计算结果出现inf的原因及解决方法 在图像处理中,归一化互相关NCC)是一种常用的模板匹配方法,用于计算两个图像块的相似性。其数学定义为: $$ \text{NCC}(u,v) = \frac{\sum_{x,y} (I(x,y) - \mu_I)(T(x-\Delta x, y-\Delta y) - \mu_T)}{\sigma_I \sigma_T} $$ 其中,$\mu_I$和$\mu_T$分别是图像块$I$和模板$T$的均值,$\sigma_I$和$\sigma_T$是它们的标准差。当计算结果为“inf”(无穷大)时,通常表示计算过程中发生了除以零的错误。我会逐步分析原因并提供解决方法,以确保回答真实可靠。 #### 1. **原因分析** NCC计算结果出现inf的主要原因集中在分母$\sigma_I \sigma_T$上: - **分母为零**:这是最常见的原因。当图像块或模板的标准差$\sigma_I$或$\sigma_T$为零时,公式中的分母变为零,导致除法结果为inf。标准差为零通常发生在图像块内容完全均匀(即所有像素值相同)时。例如,在图像边缘或纹理缺失区域,像素值恒定,计算$\sigma$时会得到零值[^1][^4]。 - **数值不稳定**:在浮点计算中,如果标准差非常小(接近机器精度,如$10^{-16}$),除以一个极小的数可能导致数值溢出,生成inf。这尤其在图像光照变化大或数据范围广时发生。 - **输入数据问题**:图像数据中包含无效值(如NaN或Inf本身),或图像未经预处理(例如,未归一化亮度),导致计算过程传播inf[^1][^3]。 - **实现错误**:代码实现时边界处理不当,例如在搜索范围内遇到无效平移(d),或数据类型转换错误,放大计算误差。 这些原因突显了NCC对图像纹理变化的敏感性:当图像缺少纹理或光照不均时,标准差易降至零[^1]。 #### 2. **解决方法** 针对上述原因,以下是有效的解决策略。这些方法已在实际应用中被广泛验证,能显著减少inf的出现。 - **添加小常数(epsilon)**:在分母中添加一个小的正数$\epsilon$(例如$\epsilon = 10^{-10}$),避免除以零。公式调整为: $$ \text{NCC}(u,v) = \frac{\sum_{x,y} (I(x,y) - \mu_I)(T(x-\Delta x, y-\Delta y) - \mu_T)}{\sigma_I \sigma_T + \epsilon} $$ 这能防止inf,同时不影响匹配精度,因为$\epsilon$很小。实现时,$\epsilon$的选择应基于图像数据范围(例如,设为像素值范围的$10^{-6}$倍)[^1][^4]。 - **预处理图像以减少均匀区域**:在NCC计算前,对图像进行预处理: - 应用直方图均衡化或高斯滤波,增强纹理,减少均匀块的出现概率。 - 检测并跳过标准差为零的块:计算前检查$\sigma_I$和$\sigma_T$,如果任一标准差小于阈值(如$10^{-5}$),则将其视为无效匹配点,并设置默认值(例如视差为0或跳过该点)。 这种方法能提高算法的鲁棒性,尤其在光照变化的场景中[^1][^3]。 - **优化算法实现**: - 使用数值稳定技术:在计算标准差时,采用数值稳定的公式(如Welford算法),避免累积误差。 - 限制搜索范围:通过粗到精策略(如金字塔多尺度搜索),先在大范围粗匹配,再在局部精细匹配,减少无效计算区域。 - 调试输入数据:确保图像输入无NaN或Inf值,可通过数据清洗或初始化检查实现。 例如,在Python中实现时,添加epsilon的代码片段: ```python import numpy as np def compute_ncc(I_block, T_block, epsilon=1e-10): mu_I = np.mean(I_block) mu_T = np.mean(T_block) sigma_I = np.std(I_block) sigma_T = np.std(T_block) denominator = sigma_I * sigma_T + epsilon # 添加epsilon防止除以零 if denominator <= epsilon: # 如果分母接近零,返回默认值 return 0.0 numerator = np.sum((I_block - mu_I) * (T_block - mu_T)) ncc_value = numerator / denominator return ncc_value ``` - **替代方法或混合策略**:如果NCC频繁出现inf,考虑切换到其他相似性度量(如SAD或SSD),或结合深度学习模型减少对传统计算的依赖。例如,SAD方法对亮度变化敏感但不易出现inf,可在纹理缺失区域作为备选[^1][^4]。 通过以上方法,inf问题通常能得到解决,提升NCC的实用性和可靠性。实际应用中,建议在预处理和epsilon添加上优先投入精力,因为它们简单高效[^1]。 #### 总结 NCC计算结果为inf主要源于分母为零或数值不稳定,常见于图像纹理缺失区域。解决方法包括添加小常数、预处理图像、优化实现和使用替代度量。这些策略能有效消除inf,确保匹配精度。如果您提供更多细节(如具体代码或图像类型),我可以进一步针对性分析。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值