Matlab 使用自定义窗口应用自定义过滤器
我试图解决以下问题: 我是一个由0和1组成的内核, e、 类交叉核 内核=Matlab 使用自定义窗口应用自定义过滤器,matlab,filter,kernel,extraction,Matlab,Filter,Kernel,Extraction,我试图解决以下问题: 我是一个由0和1组成的内核, e、 类交叉核 内核= 0 1 0 1 1 1 0 1 0 我需要把它应用到一个给定的矩阵,比如 D= 对于semplicity,我们假设从元素D(2,2)开始,它是11,以避免填充(我可以使用padarray)。 我应该叠加内核并只提取内核==1的元素,即 [2,5,11,10,7]然后对其应用自定义过滤器,如中值或平均值,并用结果替换中心元素。 然后我想通过所有其他元素(忽略sempl
0 1 0
1 1 1
0 1 0
我需要把它应用到一个给定的矩阵,比如
D=
对于semplicity,我们假设从元素D(2,2)开始,它是11,以避免填充(我可以使用padarray)。
我应该叠加内核并只提取内核==1的元素,即
[2,5,11,10,7]然后对其应用自定义过滤器,如中值或平均值,并用结果替换中心元素。
然后我想通过所有其他元素(忽略semplicity的边元素)并执行相同的操作。
现在我使用的是tempS=ordfilt2(Z,顺序,内核,'symmetric')代码>
它使用中值滤波器精确地执行该操作。但我想使用不同的标准(即平均值或一些奇怪的操作)这应该满足您的要求:
D = rand(10,20);
kernel = [0,1,0;1,1,1;0,1,0];
[dy,dx] = find(kernel==1);
% should be calculated from kernel
dy = dy-2;
dx = dx-2;
% start and stop should calculated by using kernel size
result = zeros(size(D));
for y = 2:(size(D,1)-1)
for x = 2:(size(D,2)-1)
elements = D(sub2ind(size(D),y+dy,x+dx));
result(y,x) = weirdOperation(elements);
end
end
然而,就速度而言,这将表现得非常糟糕。你应该考虑使用内置函数。code>conv2
或filter2
用于线性筛选操作<代码>ordfilt2用于订单统计功能 使用。这也会自动处理边界效果(请参见)。例如,要计算内核屏蔽的值的中值:
mask = logical(kernel);
R = blockproc(D, [1 1], @(d) median(d.data(mask)), ...
'bordersize', [1 1], 'trimborder', 0);
第一个[1]
指示该步骤。第二个[11]
指示围绕中心元素的元素数量
对于示例D
,结果是
R =
2 3 3 3
9 7 8 10
5 9 10 6
4 7 6 1
非常感谢你,我会试着。。。我尝试使用blockproc,但无法使用我的面膜。
R =
2 3 3 3
9 7 8 10
5 9 10 6
4 7 6 1