0

2D画像を1Dとフィルターに変換しようとしますが、その画像を1Dフィルターでフィルター処理して、2D畳み込みの場合と同じ対応するピクセル応答を取得したいのです。

私はやった

I1 = I(:)
filter1 = filter(:);
response = imfilter(I1,filter1,'conv')
response2d = imfilter(I,filter,'conv');

ただし、一致するエントリとは異なりますresponseresponse2d

どうすればその問題を解決できますか?なにか提案を?

4

2 に答える 2

1

2D信号の畳み込みは、数学的には1D信号の畳み込みと同じではありません。したがって、同じ結果を生成することはできません。

たとえば、平均フィルターがある場合、次のように言います。

A = [1/9 1/9 1/9;
    1/9 1/9 1/9;
    1/9 1/9 1/9]

次に、ピクセルP(i,j)の場合、結果の強度は次の値の影響を受けます。

R(i,j) = 
1/9 * 
( P(i-1,j-1) + P(i-1,j) + P(i-1,j+1) +
P(i,j-1) + P(i,j) + P(i,j+1) +
P(i+1,j-1) + P(i+1,j) + P(i,j+1) 
)

フィルタカーネルと信号を列に広げた場合、(簡単にするために)ピクセルP(i,j)が行の中央のどこかにあり、端に近くないと言うと、新しい値は次のようになります。

R(i,j) = 
1/9 * (
R(i-4,j) + R(i-3,j) + R(i-2,j) + R(i-1,j) +
R(i,j) +
R(i+1,j) + R(i+2,j) + R(i+3,j) + R(i+4,j)
)

もちろん、新しい1D信号では、インデックスは2次元ではなく 、信号が分散しているためにR(i,j)なります。R( i + j*imageHeight )

2番目のケースのすべてのピクセルの値は、異なるネイバーを使用して計算されているため、任意の画像に対して等しくすることはできません。特定の周期的な信号を使用する特別な場合に限ります。

于 2013-03-19T10:01:59.783 に答える
1

一般的には不可能です。ただし、非常に重要なクラスのフィルターカーネルの場合、それは可能であるだけでなく、非常に効率的でもあります。これは、いわゆる分離可能カーネルのクラスであり、平均(別名ボックスぼかし)フィルター、ガウスぼかし、および行列Kを2つのベクトルの外積K = u*vとして表すことができる他のすべてのカーネルが含まれます。つまり、Kと同じ数の行を持つ列ベクトルuと、 Kと同じ数の列を持つ行ベクトルvの積です。

この場合、カーネルKを使用した画像Iの2D畳み込みは、 2つの1D畳み込みのシーケンスに数学的に等しくなります。つまり、Iの列をuで畳み込み、その後に結果のvを使用した畳み込みが続きます。最初の畳み込み。分離可能なフィルターの詳細については、こちらをご覧ください。

一般的な2DカーネルKを使用していて、それが分離可能かどうかわからない場合、それをテストする方法は、その特異値分解(SVDK = U * S * Vを計算することです。多数のライブラリのいずれか。次に、最初のS(1,1)を除いて、行列Sのすべての対角項(K特異値)がほぼゼロであるかどうかを確認します。SVDライブラリは通常、最大から最小の順にソートされた順序で特異値を生成するため、S(1,1)> 0およびS(2,2)/ S(1,1)<<1であることを確認するだけで済みます。これが事実である場合、それはu == U(:、1) 、 Uの最初の列、およびv == V(1、:)、行列Vの最初の行。

于 2013-03-19T13:09:21.580 に答える