OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
フーリエ変換

目的

  • OpenCVを使って画像のフーリエ変換を求める
  • フーリエ変換のいくつかの応用
  • 次の関数を学ぶ : cv.dft() など

理論

フーリエ変換は、各種フィルタの周波数特性を解析するために使われる。画像については、周波数領域を求めるために 2次元離散フーリエ変換 (DFT) が使われる。DFTの計算には 高速フーリエ変換 (FFT) と呼ばれる高速アルゴリズムが使われる。これらの詳細は、任意の画像処理または信号処理の教科書で見つけることができる。

正弦波信号 \(x(t) = A \sin(2 \pi ft)\) について、\(f\) は信号の周波数であると言える。その周波数領域をとると、\(f\) にスパイクが見られる。信号がサンプリングされて離散信号になった場合、同じ周波数領域が得られるが、範囲 \([- \pi, \pi]\) または \([0,2\pi]\)(N点DFTの場合は \([0,N]\))で周期的になる。画像は2方向にサンプリングされた信号と考えることができる。したがって、X方向とY方向の両方でフーリエ変換をとると、画像の周波数表現が得られる。

より直感的には、正弦波信号について、振幅が短時間で非常に速く変化するなら、それは高周波信号であると言える。ゆっくりと変化するなら、それは低周波信号である。同じ考え方を画像にも拡張できる。画像において振幅が急激に変化するのはどこか? エッジ点やノイズである。したがって、エッジやノイズは画像中の高周波成分であると言える。振幅にあまり変化がなければ、それは低周波成分である。

DFT計算のパフォーマンスは、配列サイズによっては良くなる。配列サイズが2のべき乗のとき最も速い。サイズが2、3、5の積である配列も、かなり効率的に処理される。そのため、コードのパフォーマンスが気になる場合は、DFTを求める前に(ゼロを詰めることで)配列のサイズを最適なサイズに変更できる。OpenCVはこのための関数 cv.getOptimalDFTSize() を提供する。

ではフーリエ変換の求め方を見ていこう。

OpenCVにおけるフーリエ変換

DFT計算のパフォーマンスは、配列サイズによっては良くなる。配列サイズが2のべき乗のとき最も速い。サイズが2、3、5の積である配列も、かなり効率的に処理される。そのため、コードのパフォーマンスが気になる場合は、(ゼロを詰めることで)配列のサイズを最適なサイズに変更できる。では、この最適なサイズはどうやって求めるのか? OpenCVはこのための関数 cv.getOptimalDFTSize() を提供する。

次の関数を使う: cv.dft (src, dst, flags = 0, nonzeroRows = 0)

引数
src実数または複素数の入力配列。
dstサイズと型がフラグに依存する出力配列。
flagscv.DftFlags の組み合わせを表す変換フラグ。
nonzeroRowsこの引数が0でない場合、関数は入力配列の最初のnonzeroRows行のみ(DFT_INVERSEが設定されていない場合)、または出力配列の最初のnonzeroRows行のみ(DFT_INVERSEが設定されている場合)が非ゼロを含むと仮定する。これにより、関数は残りの行をより効率的に処理して時間を節約できる。この手法は、DFTを使った配列の相互相関や畳み込みの計算に非常に有用である。

cv.getOptimalDFTSize (vecsize)

引数
vecsizeベクトルのサイズ。

cv.copyMakeBorder (src, dst, top, bottom, left, right, borderType, value = new cv.Scalar())

引数
src実数または複素数の入力配列。
dstサイズと型がフラグに依存する出力配列。
top元画像の矩形からの各方向において、上側に何ピクセル外挿するかを指定する引数。
bottom元画像の矩形からの各方向において、下側に何ピクセル外挿するかを指定する引数。
left元画像の矩形からの各方向において、左側に何ピクセル外挿するかを指定する引数。
right元画像の矩形からの各方向において、右側に何ピクセル外挿するかを指定する引数。
borderType境界の種類。
valueborderType == cv.BORDER_CONSTANT の場合の境界値。

cv.magnitude (x, y, magnitude)

引数
xベクトルの x 座標からなる浮動小数点配列。
yベクトルの y 座標からなる浮動小数点配列。x と同じサイズである必要がある。
magnitudex と同じサイズおよび型の出力配列。

cv.split (m, mv)

引数
m入力マルチチャンネル配列。
mv配列の出力ベクトル。必要に応じて各配列は再確保される。

cv.merge (mv, dst)

引数
mv結合する行列の入力ベクトル。mv 内のすべての行列は同じサイズおよび同じビット深度である必要がある。
dstmv[0] と同じサイズおよび同じビット深度の出力配列。チャンネル数は行列配列の総チャンネル数になる。

試してみる