目的是在[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);
最初的想法是计算差异并将其存储在像素的位置而不是中心像素。然后使用滑动窗口取平均值并替换中心像素。
很明显,我的逻辑是有缺陷的。
虽然我能够计算出差异(我首先试图看到简单的差异对我来说)我不得不处理被覆盖的数据。此外,此方法将创建一个比原始矩阵更大的矩阵,这也是错误的。
答案 0 :(得分:2)
函数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;