という疑問の検証実験になります。まずフーリエ変換は、
画像の画素の座標空間x,yを、周波数空間u,vに置換する変換です。
詳しい説明は至る所にあるので省略です。フーリエ変換は大学2年くらいで習います。そのあとに続く工業分野で大変大事な考えです。メーカーエンジニアから開発者、研究者になるひとには基本です。画像処理、光学、信号解析、金融などあらゆる分野で出てきます。その道に進む人は1回しっかり学習をお勧めします。
今日はそのうちの画像に対する利用で周波数フィルタリングをする際の前処理のフーリエ変換の特徴について、気になったことがあるので個人的に実験します。
問1、画像をフーリエ変換するとサイズは小さくなるのか?
簡単な例で実証します。
import cv2
import numpy as np
img = cv2.imread('c:/temp/ts.bmp', cv2.IMREAD_GRAYSCALE)
cv2.imwrite('c:/temp/tsmono.bmp',img)
cv2.imshow("base",img)
#fft変換
f_img = np.fft.fft2(img)
f_img = np.fft.fftshift(f_img)
cv2.imshow("fft",f_img.real)
cv2.imwrite('c:/temp/tsfft.bmp',f_img.real)
#逆変換で元の画像に戻す。
#値調整が必要
if_img = np.fft.ifft2(f_img)
#変換後の結果には複素数なので、絶対値をとる
#(実部だけだと、元の絵にはなりません)
ifr_img = np.abs(if_img)
#グレースケールなので0-255へ変換必要
ifru_img = np.uint8(ifr_img)
cv2.imshow("ifft",ifru_img)
cv2.imwrite('c:/temp/itsfft.bmp',ifru_img)
ifru_img=ifr_img-img
#変化はあったかの確認0ならなし。
cv2.imshow("ifft_diff",ifru_img)
cv2.imwrite('c:/temp/tsfft_diff.bmp',ifru_img)
cv2.waitKey(0)
cv2.destroyWindow()
実行結果
・(左)元120,778 バイト ・(中)fft像 ・(右)逆fft後120,778 バイト



差分を見ると全部0なので完全に元に戻ったことがわかりますね。

すべて8BitのBMPでした。
今日から使えるフーリエ変換 普及版 式の意味を理解し、使いこなす (ブルーバックス) [ 三谷 政昭 ] 価格:1,430円 |
高校数学でわかるフーリエ変換 (ブルーバックス) [ 竹内 淳 ] 価格:1,100円 |


コメント