Matlab 使用自定义窗口应用自定义过滤器

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组成的内核, e、 类交叉核

内核=

 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