1

假设我有一个10 x 10矩阵。然后我要做的是用一个矩阵遍历整个3 x 3矩阵(除了边缘以使其更容易),并从这个矩阵中我得到这个空间3 x 3的平均值/平均值。3 x 3然后我想做的是用那些新的平均值/平均值替换原始矩阵值。

有人可以向我解释我该怎么做吗?一些代码示例将不胜感激。

4

2 回答 2

4

您尝试做的事情称为卷积。在 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'标志仅表示您要返回的矩阵与原始矩阵的大小相同。这很重要,因为正如您自己意识到的那样,有多种处理边缘的方法。

于 2012-04-25T21:49:31.243 回答
1

为此,您需要保持原件完好无损,直到您掌握了所有方法。这意味着如果您使用循环来实现这一点,则必须将平均值存储在不同的矩阵中。要获得边界,最简单的方法是将原始矩阵复制到新矩阵,尽管只需要复制边界。

average3x3函数将输入复制MatrixAveragedMatrix,然后遍历所有不在任何边界上的元素,计算 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);
于 2012-04-25T21:51:52.837 回答