归一化二维互相关矩阵的计算

本文详细解析了Matlab中归一化二维互相关矩阵的定义与计算过程,阐述了不同位移情况下模板与固定矩阵之间的相对移动,并通过实例展示了如何利用normxcorr2函数进行图像模板匹配。

一. 定义

首先看Matlab help 里normxcorr2函数中关于归一化二维互相关矩阵的定义:
这里写图片描述
核心就是模板template 二维矩阵使用(u,v)的位移和fixed 矩阵做点乘求和.
其中template 比 fixed 要小. 假设template矩阵是mn的, fixed矩阵是MN的.

二. 计算过程

下面的坐标系都是以matlab的矩阵坐标系来说明的.也就是左上角是坐标原点, 竖直方向往下是x正方向,
水平方向往右是y的正方向.
u=0,v=0时, 两矩阵左上角(1,1)位置对齐.
显然,
1. 当u>0,v>0时, template 相对于fixed 是往右下角移动了. x轴移动了u单位, y轴移动了v单位.
2. 当u>0,v<0时, template 相对于fixed 是往左下角移动了. x轴移动了u单位, y轴移动了v单位.
3. 当u<0,v<0 时, template 相对于fixed 是往左上角移动了. x轴移动了u单位, y轴移动了v单位.
4. 当u<0,v>0 时, template 相对于fixed 是往右上角移动了. x轴移动了u单位, y轴移动了v单位.
当然, u,v的取值是有限的, 因为必须要保证template和fixed矩阵是有相交部分的.
否则相关系数都是0. 没有计算意义.

所以,
u的取值是[(m1),M1], 共M+m1点,
v的取值是[(n1),N1], 共N+n1点.

所以,
最后的相关系数矩阵是(M+m1)(N+n1)大小的.

因为matlab是从(1,1)索引开始存储数据的.
所以,
(1,1)索引处, u=(m1)=1m,v=(n1)=1n.

所以,
已知相关系数矩阵索引(i, j), 对应公式中:

u=im,v=jn

通过这个公式, 就可以把mat索引和相关矩阵的偏移量联系起来了.

下面是matlab自带的example:
通过normxcorr2函数求template和fixed的偏移量.
这种方法在图像模板匹配中是常用的方法.
注意: imshow输出的figure坐标是图像坐标, 和mat坐标是不同的.

template = .2*ones(11); % Make light gray plus on dark gray background
template(6,3:9) = .6;   
template(3:9,6) = .6;
BW = template > 0.5;      % Make white plus on black background
figure, imshow(BW), figure, imshow(template)
% Make new image that offsets the template
offsetTemplate = .2*ones(21); 
offset = [3 5];  % Shift by 3 rows, 5 columns
offsetTemplate( (1:size(template,1))+offset(1),...
                (1:size(template,2))+offset(2) ) = template;
figure, imshow(offsetTemplate)
% Cross-correlate BW and offsetTemplate to recover offset  
cc = normxcorr2(BW,offsetTemplate); 
[max_cc, imax] = max(abs(cc(:)));
[ypeak, xpeak] = ind2sub(size(cc),imax(1));
corr_offset = [ (ypeak-size(template,1)) (xpeak-size(template,2)) ];
isequal(corr_offset,offset) % 1 means offset was recovered
### Python中二维矩阵归一化的实现 在Python中,可以通过`NumPy`库高效地完成矩阵归一化操作。归一化是一种常见的数据预处理技术,用于将数值调整到特定范围(通常是[0, 1])。以下是基于`NumPy`的一种无循环方式来实现二维矩阵归一化。 #### 方法描述 对于给定的一个二维矩阵 `matrix`,其每一行都可以通过以下公式进行归一化: \[ normalized\_value = \frac{x - min}{max - min} \] 其中 \(x\) 是当前元素值,\(min\) 和 \(max\) 分别表示该行中的最小值和最大值。如果某一行的最大值等于最小值,则为了避免除零错误,通常会将其设置为全零向量或者保持原样[^1]。 下面是具体的代码实现: ```python import numpy as np def normalize_rows(matrix): """ 对输入的二维矩阵按照行进行归一化。 参数: matrix (numpy.ndarray): 输入的二维数组 返回: numpy.ndarray: 归一化后的二维数组 """ # 计算每行的最小值和最大值 row_min = matrix.min(axis=1).reshape(-1, 1) # 每行最小值 row_max = matrix.max(axis=1).reshape(-1, 1) # 每行最大值 # 防止分母为零的情况 range_values = row_max - row_min range_values[range_values == 0] = 1 # 如果某个范围内所有值相同,则设为1防止除零 # 应用归一化公式 normalized_matrix = (matrix - row_min) / range_values return normalized_matrix # 测试示例 matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) row_normalized_matrix = normalize_rows(matrix) print("原始矩阵:") print(matrix) print("\n行归一化后的矩阵:") print(row_normalized_matrix) ``` #### 输出解释 运行以上代码后,将会得到如下输出结果: ``` 原始矩阵: [[1 2 3] [4 5 6] [7 8 9]] 行归一化后的矩阵: [[0. 0.5 1. ] [0. 0.5 1. ] [0. 0.5 1. ]] ``` 此方法利用了`NumPy`的强大广播功能,无需显式循环即可快速计算整个矩阵归一化值[^2]。 --- ### 注意事项 1. **特殊情况处理** 当某一整行的所有元素都相同时,由于分子和分母均为零,可能会引发未定义行为。因此,在实际应用中应特别注意这种情况,并根据具体需求决定如何处理这些特殊情形[^3]。 2. **其他标准化方法** 虽然本文讨论的是简单的极值归一化方法,但在某些场景下可能更适合采用Z-Score标准化或其他更复杂的变换形式[^4]。 3. **扩展至列方向** 上述例子是对矩阵按照行的方向进行了归一化。如果希望沿列方向实施同样的逻辑,只需简单修改参数`axis=0`即可[^5]。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值