チーム19E1

課題名

ミニオンのリアルタイムフーリエ変換

研究者名

Masato Sasaki
Ka Kei

概要

画像の任意の箇所について、リアルタイムでフーリエ変換した周波数成分が出力されるプログラムを作成した。

今回はPythonで記述し、FFTはNumpyあるfft計算を用いた。
◎numpy.fft.fft
 N個の時間軸上の配列値に対する離散フーリエ変換を高速に実行し、複素数から成るndarrayを戻り値とする。
   numpy.fft.fft(
     a --------- 入力配列で、複素数を含んでも良い
     norm = None ------- 'ortho'にすると正規化モードになる
   )

ソースコード

import numpy as np
import cv2
import copy

import tkinter

def nothing(x):
  pass

def mouse(event,x,y,flags,param):
  """
   マウスが動いたときの動作
   """


  global img2,px,py,tx1,tx2,ty1,ty2

  img2=copy.deepcopy(img)
   #マウスが動いたイベントの場合
   if event == cv2.EVENT_MOUSEMOVE:

      #トリミングする左上(tx1,ty1)と右下(tx2,ty2)を指定
       tx1=x-int(px/2)
       tx2=x+int(px/2)
       ty1=y-int(py/2)
       ty2=y+int(py/2)


      print(x,tx1,tx2)
       print(y,ty1,ty2)

      #画像端部での動作
       if tx1<0:
           tx1=0
           tx2=px
       if tx2>img2.shape[1]:
           tx1=img2.shape[1]-px
           tx2=img2.shape[1]

      if ty1<0:
           ty1=0
           ty2=py
       if ty2>img2.shape[0]:
           ty1=img2.shape[0]-py
           ty2=img2.shape[0]

      #トリミングする場所を四角で囲う
       cv2.rectangle(img2,(tx1,ty1),(tx2,ty2),(255,0,0),1)

def mosaic(img, ratio):
  small = cv2.resize(img, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
   return cv2.resize(small, img.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)

def fourie(img):
  """
   画像中の特定位置の画像をフーリエ変換
   """
   global img2,px,py,tx1,tx2,ty1,ty2

  #ウィンドウを作成
   cv2.namedWindow("img",cv2.WINDOW_NORMAL)
   cv2.namedWindow("img2",cv2.WINDOW_NORMAL)
   cv2.namedWindow("FFT",cv2.WINDOW_NORMAL)
   cv2.namedWindow("mosaic",cv2.WINDOW_NORMAL)
   #トリミングする画像領域の大きさを指定するバーを作成
   cv2.createTrackbar('x','img',10,300,nothing)
   cv2.createTrackbar('y','img',10,300,nothing)

  #マウスモーション
   cv2.setMouseCallback('img',mouse)


  img2=copy.deepcopy(img)

  #初期値
   tx1,tx2,ty1,ty2=0,5,0,5
   while(1):

      #バーから値を取得
       px = cv2.getTrackbarPos('x','img')
       py = cv2.getTrackbarPos('y','img')


      #マウス位置の周辺をトリミング
       img3=img[ty1:ty2,tx1:tx2]

      #フーリエ変換
       FFT = np.fft.fft2(img3)
       fshift = np.fft.fftshift(FFT)
       ms = 20*np.log(np.abs(fshift))
       ms=ms/(np.max(ms))*2**8

      #moasic
       img4=mosaic(img2,0.1)


      cv2.imshow("img",img2)
       cv2.imshow("img2",img3)
       cv2.imshow("FFT",ms.astype(np.uint8))
       cv2.imshow("mosaic",img4)

      k=cv2.waitKey(1) & 0xFF
       if k ==27:
           break





  cv2.destroyAllWindows()


#フォルダーとファイル名
filename=r"minion.jpg"

#画像読み込み
img=cv2.imread(filename)


tes=fourie(img)

実行例

ミニオン
ミニオン2.png

出力されているのは、元の画像、選択された部分,部分に対するFFT、全体のモザイク画像

考察

今回はリアルタイムにカーソルでウインドウを動かし、その部分に対するFFTの周波数成分を出力した。
画像の移り変わりとともに周波数成分の出力も次々と移り変わったことから、FFTがいかに高速なアルゴリズムであるのかが分かる。
また、周波数成分をみてみると多くが低周波の成分であり、顔が違うミニオンの画像それぞれに対しても周波数成分はそこまで変化がなかった。このことから、低い周波数成分は画像のおおまかな形状を,高い周波数成分は緻密な部分の情報を担っていると推察できる。
つまり、周波数成分の世界ではボブもケビンもスチュアートもほぼ同じであるということになる。

今回は時間の都合上実装できなかったが、モザイク画像に対するFFTとの比較検討もおもしろいと考えている。

使用したライブラリの詳細


  • 最終更新:2019-11-25 16:08:51

このWIKIを編集するにはパスワード入力が必要です

認証パスワード