コンボリューションは、導関数の計算、エッジの検出、ブラーの適用などの多くの目的で使用され、これらはすべて「コンボリューション カーネル」を使用して行われます。コンボリューション カーネルは非常に小さな行列であり、この行列では各セルに番号とアンカー ポイントがあります。
アンカーポイントは、画像に対するカーネルの位置を知るために使用されます。画像の左上隅から開始し、各ピクセル上を順番に移動します。カーネルは、画像上の各位置で数ピクセルをオーバーラップします。重なった各ピクセルは乗算されてから加算されます。そしてその合計が現在位置の値として設定されます。
畳み込みは、画像の各要素がそのローカルな隣接要素に追加され、カーネルによって重み付けされるプロセスです。これは数学的畳み込みの一種に関連しています。
Convolution では、行列は従来の行列の乗算を実行しませんが、* で示されます。
2 つの 3x3 行列があり、1 つはカーネル、もう 1 つは画像部分であると仮定します。畳み込みでは、カーネルの行と列が反転され、乗算されてから合計が実行されます。マトリックスの中心、つまり画像の [2,2] に存在する要素は、画像マトリックスの重み付けされた組み合わせとなり、重みはカーネルによって与えられます。同様に、行列の他のすべての要素に重みが付けられ、重みが計算されます。
以下は、畳み込みプロセスを説明する擬似コードです。
For each image row in input image: For each pixel in image row: Set accumulator to zero For each kernel row in kernel: For each element in kernel row: If element position corresponding* to pixel position then Multiply element value corresponding*to pixelvalue Add result to accumulator Endif Set output image pixel to accumulator
畳み込みは、複数の for ループを使用して計算できます。ただし、for ループを使用すると、多くの繰り返し計算が発生し、イメージとカーネルのサイズも増加します。離散フーリエ変換手法を使用すると、畳み込みの計算を迅速に行うことができます。この手法では、畳み込み演算全体が単純な乗算に変換されます。
畳み込みでは、カーネルが 2 次元であるため、カーネルがエッジまたはコーナーの近くにある場合に問題が発生します。
これらの問題を解決するには、次のことを行うことができます。
- 無視しても構いません
- 余分なピクセルがエッジ近くに作成される可能性があります。
追加のピクセルは次の方法で作成できます。
- エッジピクセルが重複しています。
- エッジを反射する
- ピクセルはもう一方の端からコピーできます。