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コピーしてから、どの境界線上にもないすべての要素を調べ、3x3 空間の平均を計算し、それを の対応する要素に格納します。MatrixAveragedMatrixAveragedMatrix

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 に答える