假设我有一个10 x 10
矩阵。然后我要做的是用一个矩阵遍历整个3 x 3
矩阵(除了边缘以使其更容易),并从这个矩阵中我得到这个空间3 x 3
的平均值/平均值。3 x 3
然后我想做的是用那些新的平均值/平均值替换原始矩阵值。
有人可以向我解释我该怎么做吗?一些代码示例将不胜感激。
假设我有一个10 x 10
矩阵。然后我要做的是用一个矩阵遍历整个3 x 3
矩阵(除了边缘以使其更容易),并从这个矩阵中我得到这个空间3 x 3
的平均值/平均值。3 x 3
然后我想做的是用那些新的平均值/平均值替换原始矩阵值。
有人可以向我解释我该怎么做吗?一些代码示例将不胜感激。
您尝试做的事情称为卷积。在 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'
标志仅表示您要返回的矩阵与原始矩阵的大小相同。这很重要,因为正如您自己意识到的那样,有多种处理边缘的方法。
为此,您需要保持原件完好无损,直到您掌握了所有方法。这意味着如果您使用循环来实现这一点,则必须将平均值存储在不同的矩阵中。要获得边界,最简单的方法是将原始矩阵复制到新矩阵,尽管只需要复制边界。
该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);