假设我有一个10 x 10
矩阵。然后我做的是使用3 x 3
矩阵遍历整个矩阵(边缘除外以使其更容易),并且从此3 x 3
矩阵我得到此{{1}的均值/平均值}} 空间。我当时想要做的是用那些新的平均值/平均值替换原始矩阵值。
有人可以向我解释我该怎么做吗?一些代码示例将不胜感激。
答案 0 :(得分:4)
您要做的是convolution。在MATLAB中,您可以执行以下操作(阅读更多有关卷积以及如何在MATLAB中完成的内容)。
conv2( myMatrix , ones(3)/9 , 'same' );
有点破译。 myMatrix
是您正在处理的矩阵(您提到的10x10)。 ones(3)/9
命令创建过滤内核的所谓掩码,
1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9
当您使用此蒙版并移动它时,将蒙版的条目值与图像的3x3条目相乘,然后添加结果(点积,本质上),您将获得9个值的平均值最终在这个面具下面。所以,一旦你将这个掩码放在矩阵的每个3x3段(图像,我想象)上并用平均值替换中间的值,就会得到该命令的结果。欢迎您进一步尝试。 'same'
标志仅表示您获取的矩阵与原始矩阵的大小相同。这很重要,因为正如您自己所知,有多种方法可以处理边缘。
答案 1 :(得分:1)
要做到这一点,你需要保持原件完整,直到你掌握了所有方法。这意味着如果使用循环实现此操作,则必须将平均值存储在不同的矩阵中。为了获得边界,最简单的方法是将原始矩阵复制到新矩阵,尽管只需要复制边框。
此average3x3
函数将输入Matrix
复制到AveragedMatrix
,然后遍历所有不在任何边框上的元素,计算3x3空间的平均值并将其存储在相应的AveragedMatrix
的元素。
function [AveragedMatrix] = average3x3(Matrix)
AveragedMatrix = Matrix;
if ((size(Matrix, 1) < 3) || (size(Matrix, 2) < 3))
fprintf('Matrix is too small, minimum matrix size is 3x3.\n');
return
end
for RowIndex = 2:(size(Matrix, 1)-1)
Rows = RowIndex-1:RowIndex+1;
for ColIndex = 2:(size(Matrix, 2)-1)
Columns = ColIndex-1:ColIndex+1;
AveragedMatrix(RowIndex,ColIndex) = mean(mean(Matrix(Rows,Columns)));
end
end
return
要使用此功能,您可以尝试:
A = randi(10,10);
AveragedA = average3x3(A);