重叠相关的算法

本文探讨了在长序列与短序列卷积中如何通过重叠相加法、重叠保留法和加权重叠相加法解决块效应问题。详细阐述了各方法的实现原理,包括线性卷积与圆周卷积的转换,以及如何通过DFT和IDFT减少计算量。加权重叠相加法中强调了窗函数在信号恢复过程中的作用,以减少块边界处的噪声并保持高频信息。

重叠相关的算法

在实际中,常遇到长序列卷积短序列的问题。
一长序列x(n)在和单位抽样响应h(n)进行卷积时,需要利用截短(分块)x(n)的方法,变成和h(n)长度接近。每段分别和h(n)线性卷积,首尾相接时需要进行一些处理,才能得到成和原来长序列卷积h(n)相同的结果。
假设h(n)长度为M,分块的xL(n)长度为N:

重叠相加法

顾名思义,就是需要将重叠部分相加,这里的重叠指的是线性卷积之后的数据前后帧进行重叠。线性卷积后M-1点和下次结果的前M-1重叠,重叠部分相加,这时对分块的输入序列xL(n)不需要重叠。如果希望利用DFT替代卷积来减少计算量,那么需要转成对应的圆周卷积(循环卷积),就涉及到对xL(n)和h(n)扩充到L>=M+N-1点,这样IDFT的结果才能对应上实现线性卷积,这里采用xL(n)进行补零到M+N-1点,h(n)同样补零处理。

重叠保留法

对信号进行截短,面临同样的问题,只不过重叠操作放到了xL(n)扩充后的数据上,这里xL(n)利用旧数据的后M-1点和新数据N点,h(n)正常补零到N+M-1点,利用DFT和IDFT,该圆周卷积结果的前M-1点数据是混叠的,所以舍去,保留了后N点,假设这里的M-1=N,那么就是常见的旧数据和新数据拼成L=2N点,FFT,点乘,IFFT,舍去前M-1=N点,保留后N点的方法。即重叠保留法实现长序列卷积短序列。

加权重叠相加法

不考虑长序列卷积短序列,只考虑x(n)信号变换及恢复(重建)问题。由于变换到频域需要进行FFT变换,为减少频域泄漏需要加窗处理(替换矩形窗),加窗就是加权的意思。最后在恢复最初信号的时候,需要利用窗函数重叠相加等于1的影响,输入信号由于加窗涉及到两个序列点乘,导致信号的窗移等于窗总长度减去重叠部分。
这里重叠的根本原因是基于块数据变换有一个严重缺点,即块效应。这是各个变换块之间不连续性和微小的边界误差导致的。这样在重建信号时将导致引入周期性噪声,可以做低通滤波去除块边界处的“突跳”,但是这样高频信息会丢失,高频决定细节。更一般的做法是采用重叠,这是专门针对块块效应的。

### 关于重叠相关算法在MATLAB中的实现 为了理解并实现在MATLAB中的重叠相关算法,可以考虑将图像分割成较小的部分来处理。这种方法有助于减少计算复杂度,并提高效率。 #### 使用`normxcorr2`函数进行二维标准化互相关运算 对于立体视觉项目而言,在MATLAB中执行标准的二维规范化交叉关联操作可以通过内置函数`normxcorr2`完成[^1]: ```matlab template = imread('template.jpg'); % Load template image image = imread('mainImage.jpg'); % Load main image to search within ccoeff = normxcorr2(template, image); % Perform normalized cross-correlation ``` 然而,当面对大型数据集时,直接应用此方法可能会遇到内存不足的问题。因此,采用分块处理策略——即所谓的“重叠保存法”,能够有效解决这一挑战[^2]。 #### 实现自定义的重叠相关算法 下面是一个简单的例子展示如何手动编写一个基于窗口滑动机制的相关性检测器,该过程涉及到了模板匹配技术的核心思想: ```matlab function corrResult = customNormXCorr(image, template) imgHeight = size(image, 1); imgWidth = size(image, 2); tplHeight = size(template, 1); tplWidth = size(template, 2); padSizeH = floor(tplHeight / 2); padSizeW = floor(tplWidth / 2); paddedImg = padarray(double(image), [padSizeH, padSizeW], 'both'); corrResult = zeros(imgHeight, imgWidth); for y = 1 : imgHeight for x = 1 : imgWidth subImg = paddedImg(y:y + tplHeight - 1, x:x + tplWidth - 1); meanSubImg = mean(subImg(:)); stdSubImg = std(subImg(:)); meanTpl = mean(template(:)); stdTpl = std(template(:)); numerator = sum((subImg(:) - meanSubImg).* (double(template(:)) - meanTpl)); denominator = numel(template)*stdSubImg*stdTpl; if denominator ~= 0 corrValue = numerator/denominator; else corrValue = 0; %#ok<NASGU> end corrResult(y,x)=corrValue; end end end ``` 上述代码展示了如何通过遍历输入图片的不同位置来进行局部区域内的标准化互相关计算。这不仅适用于小型模板与较大背景图之间的比较,也适合用于更复杂的场景分析任务。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值