滑动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
和您使用的内核都是线性的,并不代表您要实现的非线性操作。
使用 conv
和 mean
的一种方法是计算 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;
本意是估计在[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
和您使用的内核都是线性的,并不代表您要实现的非线性操作。
使用 conv
和 mean
的一种方法是计算 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;