numpyとopenCVを使った画像のフーリエ変換と逆変換

openCVを使い画像読み込み、fftで周波数データに変換。その後逆変換で元の画像に戻すテスト。

入力に使用する画像は↓。サイズは360×240。
input data to fft

まず画像入力、グレースケールで取り込む。

実行すると元の画像がグレースケールで表示される。
imreadは引数2つ、1つ目は読み込みファイル、2つ目は読み込みオプションで以下3つ(1,0,-1でも指定可)。

  cv2.IMREAD_COLOR (or 1)
  cv2.IMREAD_GRAYSCALE (or 0)
  cv2.IMREAD_UNCHANGED (or -1)

続けてFFT実施

np.fft.fft2()は2次元FFT。
実行結果が下記。入力が360×240画像だったので、360×240のnumpy arrayで返ってくる。

変換結果をパワースペクトルで確認してみる。確認に使用したコードが下記。

実行結果下記
input data to fft

最後に逆変換で元の画像に戻すコード。注意として変換後の結果には複素数成分が含まれているので、実部を取り出す処理が必要。またグレースケールで表示するために0-255階調への値調整が必要になる。

実行結果が下記グレースケールでもとの画像に戻ってきた。
results fft and inv fft

Read images using openCV, convert to frequency data with fft. And then back to the original image with reverse transformation.
Code 1 is reading image by gray scale.
Code 2 is 2D fft by numpy. Frequency distribution is returned.
Code 3 is checking Power spectrum.
Code 4 is invers Fourie by numpy.

numpy/opencv 2次元FFT

離散フーリエ変換(DFT)の高速化版アルゴリズムFFTをnumpyで試す。

■結果
input.png
FFT input img
result.png
FFT results img

python用openCVのインストール@Centos7

python2.7でopenCVのインストールをしてみる。
OSはCentos7

コマンドは下記
%yum install opencv-python

実行してみる。入力データの各画素値をダンプするテスト。
ちなみに入力するデータは→

拡大するとこんな感じ↓の5×5ピクセル画像。

■実行結果
[[[255 255 255]
[255 255 255]
[ 0 0 0]
[255 255 255]
[255 255 255]]

[[255 255 255]
[255 255 255]
[ 0 0 0]
[255 255 255]
[255 255 255]]

[[ 0 0 0]
[ 0 0 0]
[ 0 0 0]
[ 0 0 0]
[ 0 0 0]]

[[255 255 255]
[255 255 255]
[ 0 0 0]
[255 255 255]
[255 255 255]]

[[255 255 255]
[255 255 255]
[ 0 0 0]
[255 255 255]
[255 255 255]]]

255:白、0:黒
横走査を下から上に向かって行っている様子が分かる。