将矩阵值替换为MATLAB中从较小矩阵中提取的平均值

时间:2012-04-25 20:57:24

标签: matlab matrix mean convolution

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

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

2 个答案:

答案 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);