2

所以基本上我想对二进制图像应用一个过滤器,该过滤器对相邻单元格的值进行加权平均。这部分我已经设置好了。

我现在的问题是我的图像中有一个“边缘”(不是矩阵的边缘)。我想对相邻元素进行加权,但只对我感兴趣的特定元素这样做。

我知道有两种方法。1)当边缘靠近磁盘时改变磁盘过滤器的重量,或者 2)以某种方式将边缘附近的值反射/镜像到另一侧。2)的问题是我的边缘不直,到处都是。

这是场景的过度简化:

bin =  [0 0 0 0 0 0 0 0
         0 0 0 0 0 0 0 0
         1 1 1 1 0 0 0 0
         1 1 1 1 1 0 0 0
         1 1 1 1 1 0 0 0
         1 1 1 1 0 0 0 0
         0 0 0 0 0 0 0 0
         0 0 0 0 0 0 0 0];

mask = [0 0 0 0 0 0 0 0
         0 0 0 1 1 1 0 1
         1 1 1 1 1 1 1 1
         1 1 1 1 1 1 1 1
         1 1 1 1 1 1 1 1
         1 1 1 1 1 1 1 1
         0 0 1 1 0 0 0 0
         0 0 0 0 0 0 0 0];

我想应用过滤器,bin但我只想获取值为 1 in 的元素的权重mask。由于边缘的非线性,我不一定能镜像bin,所以必须有一些方法来改变磁盘滤波器的权重。例如,如果普通盘式过滤器中有 20 个元素,则每个元素的权重为 0.05。但是假设我们正处于平坦的边缘;盘式过滤器中只有一半的bin值是 1 in mask。因此将有 10 个元素,每个元素的权重为 0.1。有没有一种非迭代的方式来应用这样的过滤器?

4

1 回答 1

1

一种选择:NaN在预处理步骤中使用 (Not a Number):

bin(~mask)=NaN;

这样bin看起来像:

   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN     0     0     0   NaN     0
     1     1     1     1     0     0     0     0
     1     1     1     1     1     0     0     0
     1     1     1     1     1     0     0     0
     1     1     1     1     0     0     0     0
   NaN   NaN     0     0   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

然后nanmean在您的过滤程序中使用。通过这种方式,只有非 NaN 元素被包括在平均值的计算中,这将处理不同数量的要平均的元素。

例子:

fun = @(x) nanmean(nanmean(x));
B = nlfilter(bin,[3 3],fun);

结果:

B =

         0         0         0         0         0         0         0         0
    0.6667    1.0000    0.8333    0.5000    0.1667         0         0         0
    0.6667    1.0000    0.8889    0.6667    0.3333    0.1111         0         0
    0.6667    1.0000    1.0000    0.8889    0.5556    0.2222         0         0
    0.6667    1.0000    1.0000    0.8889    0.5556    0.2222         0         0
    0.6667    0.8889    0.7778    0.6111    0.3889    0.1667         0         0
    0.6667    0.8333    0.6667    0.3333    0.1667         0         0         0
         0         0         0         0         0         0         0         0
于 2014-11-19T21:45:38.603 回答