这是以下部分:
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)].
================================================== ================
我之前尝试了一些事情,但是我不熟悉这些功能.
所以请帮我解决问题.
先感谢您.
这是我认为您在问题中描述的算法。对于每个像素:
如果这是正确的(因为它似乎来自您提供的示例矩阵),那么您可以使用图像处理工具箱中的函数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)