滑动window for matlab

Sliding window for matlab

本意是估计在[3 3]滑动window。计算 0.5*[(A(i)-A(5))^2],其中 a(i) 是中心像素 a(5) 周围的像素。

这 8 个半平方差的平均值存储在中心像素的位置。

为了解决这个问题,conv2 和 nlfilter 在训练示例矩阵上使用如下。

clc;
close all;
clear all;
A = [1 2 3 4 5 6;5 4 6 3 2 1;2 3 2 1 4 5];
kernel = [-1 -1 -1; -1 8 -1; -1 -1 -1];
outputImage = conv2(A, kernel);
fun = @(x) mean(x(:));
B= nlfilter (outputImage,[3 3],fun);

最初的想法是计算差异并将其存储在像素的位置而不是中心像素。然后使用滑动 window 取这些差异的平均值并替换中心像素。

看来我的逻辑有问题。

虽然我能够计算出差异(我首先尝试看到简单的差异对我来说是可能的)但我不得不处理被覆盖的数据。而且这种方法会创建一个比原始矩阵更大的矩阵,这也是错误的。

函数mean和您使用的内核都是线性的,并不代表您要实现的非线性操作。

使用 convmean 的一种方法是计算 8 个差异作为不同的输出通道

ker = cell(1,8);
for ii=1:8
    ker{ii} = zeros(3);
    ker{ii}(2,2) = 1; %// for a(5)
    if ii < 5
       ker{ii}(ii) = -1; 
    else
       ker{ii}(ii+1) = -1; 
    end
 end
 interim = zeros( [size(A,1) size(A,2), numel(ker)] ); % allocate room for intermidiate results
 for ii=1:numel(ker)
     interim(:,:,ii) = conv2(A, ker{ii}, 'same' ); %//'same' takes care of output size for you
 end

现在 interim 包含每个不同的 a(5)-a(i) 我们已准备好进行非线性操作

 interim = interim.^2;
 B = 0.5 * interim;