测试周围的非零元素

Nad*_*ris 5 matlab matrix

这是以下部分:

2)其他问题:

在得到非零邻居的平均值之后,我还想测试邻居元素是否等于,小于或大于非零的平均值.如果它大于或等于'1'或者否则为'0'.

注意:如果邻居在两个或更多中心的半径内,则采用最小的中心平均值进行测试.

    0    12     9     
    4  **9**    15     
   11    19     0 
Run Code Online (Sandbox Code Playgroud)

中间的'9'在12,15和19中心的半径范围内,因此取最小平均值[9.000,9.000,8.000] = 8.000

例如,当半径= 1米或1个元素时.

new_x =

     0         0          0          0         0
     0         0     **9.0000**    9.0000      0
     0      4.0000     9.0000    **9.0000**    0
     0    **8.3333** **8.0000**      0         0
     0      2.0000     4.0000      8.0000      0
     0      4.0000     5.0000      8.0000      0
     0         0          0          0         0
Run Code Online (Sandbox Code Playgroud)

Test_x =

     0         0           0           0         0
     0         0       **9.0000**      1         0
     0         0           1       **9.0000**    0
     0    **8.3333**   **8.0000**      0         0
     0         0           0           0         0
     0         0           0           0         0
     0         0           0           0         0
Run Code Online (Sandbox Code Playgroud)

================================================== ===============================

1)假设我有一个矩阵,如下所示,

X =

 0     0     0     0     0
 0     0    12     9     0
 0     4     9    15     0
 0    11    19     0     0
 0     2     4     8     0
 0     4     5     8     0
 0     0     0     0     0
Run Code Online (Sandbox Code Playgroud)

我想找到大于10的周围非零元素的平均值.其余元素仍然保持不变,即元素<10.

所以我希望我的解决方案看起来像,

new_x =

     0         0         0         0         0
     0         0    9.0000    9.0000         0
     0    4.0000    9.0000    9.0000         0
     0    8.3333    8.0000         0         0
     0    2.0000    4.0000    8.0000         0
     0    4.0000    5.0000    8.0000         0
     0         0         0         0         0
Run Code Online (Sandbox Code Playgroud)

不是:我只是看着比某个值更重要的元素的邻居(在这种情况下是10).

让我们说任何大于10的元素都是'中心',我们想要找到半径为1米的非零值的平均值.其中1米=距离中心1个元素.

注意:半径可能不总是1米,即可以是2或更多.在这种情况下,它不会只是中心的顶部,底部,左侧和右侧.

****还要注意矩阵边界.例如,当半径= 2或更大时,一些非零邻居的平均值在边界外.**

例如,

对于radius = 1 m = 1个元素,new_x = [(i + 1,j),(i-1,j),(i,j + 1)和(i,j-1)]的平均值 - top,中心的底部,右侧和左侧.

对于半径= 2 m = 2个元素,new_x = [(i + 1,j),(i + 2,j),(i-1,j),(i-2,j)的平均值,(i, j + 1),(i,j + 2),(i,j-1),(i,j-2),(i + 1,j + 1),(i + 1,j-1),( i-1,j-1)和(i-1,j + 1)].

================================================== ================

我之前尝试了一些事情,但是我不熟悉这些功能.

所以请帮我解决问题.

先感谢您.

gno*_*ice 3

这是我认为您在问题中描述的算法。对于每个像素:

  • 如果像素值小于 10,则不执行任何操作。
  • 如果像素值大于或等于10,则将像素值替换为非零4连通最近邻的平均值。

如果这是正确的(因为它似乎来自您提供的示例矩阵),那么您可以使用图像处理工具箱中的函数NLFILTER(如果您有权访问它)来执行此操作:

fcn = @(x) [x(5) sum(x(2:2:8))/max(sum(x(2:2:8) > 0),1)]*[x(5) < 10; x(5) >= 10];
new_x = nlfilter(X,[3 3],fcn);
Run Code Online (Sandbox Code Playgroud)


编辑:如果您无权访问图像处理工具箱,您还可以使用内置的CONV2函数来执行此操作,如下所示:

kernel = [0 1 0; ...                      %# Convolution kernel
          1 0 1; ...
          0 1 0];
sumX = conv2(X,kernel,'same');            %# Compute the sum of neighbors
                                          %#   for each pixel
nX = conv2(double(X > 0),kernel,'same');  %# Compute the number of non-zero
                                          %#   neighbors for each pixel
index = (X >= 10);                        %# Find logical index of pixels >= 10
new_x = X;                                %# Initialize new_x
new_x(index) = sumX(index)./max(nX(index),1);  %# Replace the pixels in index
                                               %#   with the average of their
                                               %#   non-zero neighbors
Run Code Online (Sandbox Code Playgroud)

上面处理的是半径 = 1 的情况。要解决半径 = 2 的情况,您只需将卷积核更改为以下内容并重新运行上面的代码:

kernel = [0 0 1 0 0; ...
          0 1 1 1 0; ...
          1 1 0 1 1; ...
          0 1 1 1 0; ...
          0 0 1 0 0];
Run Code Online (Sandbox Code Playgroud)