matlab的滑动窗口

时间:2015-03-30 12:05:02

标签: matlab image-processing convolution sliding-window

目的是在[3 3]滑动窗口中进行估算。计算0.5 * [(A(i)-A(5))^ 2],其中a(i)是中心像素a(5)周围的像素。

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

为了解决这个问题,我在训练示例矩阵中使用了这个转义和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);

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

很明显,我的逻辑是有缺陷的。

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

1 个答案:

答案 0 :(得分:2)

函数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;