3

画像処理はカリキュラムの一部であるため、畳み込みを研究しています。理論と公式は理解していますが、その実装については混乱しています。

式は次のとおりです。


ここに画像の説明を入力してください


私が理解していること

畳み込みカーネルは水平方向と垂直方向の両方で反転され、カーネル内の値に対応するピクセル値が乗算され、結果が合計され、「行x列」で除算されて平均が得られ、最後にこの結果がカーネル位置の中心にあるピクセル。

実装の混乱

コース資料からサンプルの畳み込みプログラムを実行し、入力として3x3畳み込みカーネルを挿入すると、次のようになります。

1行目:(0、1、0)

2行目:(0、0、0)

3行目:(0、0、0)

処理された画像は1ピクセル下にシフトされますが、私はそれが1ピクセル上にシフトすると予想していました。この結果は、計算前に水平または垂直の反転が行われていないことを示しています(相関を行っているかのように)。

プログラムに問題があるのではないかと思ったので、周りを見回してみると、 AdobeFlex3Gimpもこれを行っていることがわかりました。

わかりませんが、気づかなかったことがありますか?

ヘルプやフィードバックに感謝します。

4

2 に答える 2

4

あなたが試したプログラムは、畳み込みではなく相関を実装していると思います。

関数を使用してMathematicaでフィルターを試しましたがImageFilter、結果は期待どおりに上にシフトします。

ここに画像の説明を入力してください

結果:

ここに画像の説明を入力してください

Octave(オープンソースのMatlabクローン)でも試してみました:

imfilter([1,1,1,1,1;
          2,2,2,2,2;
          3,3,3,3,3;
          4,4,4,4,4;
          5,5,5,5,5],
         [0,1,0;
          0,0,0;
          0,0,0],"conv")

(「conv」は畳み込みを意味します-imfilterのデフォルトは相関です)。結果:

   2   2   2   2   2
   3   3   3   3   3
   4   4   4   4   4
   5   5   5   5   5
   0   0   0   0   0

最後の行が異なることに注意してください。これは、実装が異なれば、(デフォルトでは)異なるパディングが使用されるためです。Mathematicaは、に定数パディングを使用しImageConvolve、。にはパディングを使用しませんListConvolve。Octave'simfilterはゼロパディングを使用します。

また、(ベリサリウスが述べたように)畳み込みの結果は、ソース画像よりも小さい、同じサイズ、または大きい可能性があることに注意してください。(MatlabとIPPIのドキュメントで「有効」、「同じサイズ」、「完全な」畳み込みという用語を読みましたが、それが標準的な用語かどうかはわかりません)。合計はどちらでも実行できるという考え方です

  • カーネルが完全に画像内にあるソース画像ピクセル上でのみ。その場合、結果はソース画像よりも小さくなります。
  • すべてのソースピクセルにわたって。その場合、結果はソース画像と同じサイズになります。これには、境界でのパディングが必要です
  • カーネルの任意の部分がソースイメージ内にあるすべてのピクセルにわたって。その場合、結果の画像はソース画像よりも大きくなります。これには、境界線でのパディングも必要です。
于 2011-09-17T22:04:26.913 に答える
1

その点に注意してください:

ここに画像の説明を入力してください

結果:

ここに画像の説明を入力してください

したがって、寸法が影響を受けるため、「シフト」は現実的ではありません。

于 2011-09-17T21:11:31.973 に答える