26
2次元フーリエ変換

2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

2次元フーリエ変換

Page 2: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

復習

• 前回はFFTにより1次元信号の周波数スペクトルを表示した

𝑦 𝑡 = sin 2𝜋𝑓1t + sin(2𝜋𝑓2t)

FFT

周波数

パワー

f1 f2

Page 3: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

今回の目的

• 画像データに対して二次元FFTを実行し,画像に含まれる周波数成分を表示する

• FFTを利用した周波数フィルタリングを行う

Page 4: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

1次元信号と2次元信号

𝑓 𝑥 = 𝑎 ∙ sin2𝜋

𝑁(𝑥 − 𝜃)

𝑓 𝑥, 𝑦 = 𝑎 ∙ sin2𝜋

𝑁𝑥𝑥 − 𝜃𝑥 +

2𝜋

𝑁𝑦(𝑦 − 𝜃𝑦)

X, Yに独立な周波数成分を持つ正弦波

Page 5: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

二次元空間の正弦波関数の例

画像の振幅スペクトルによる周波数解析

Page 6: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

FFTによる周波数スペクトル

Page 7: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

FFTによる周波数スペクトル

高周波成分

中間周波数成分

低周波成分

Page 8: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

FFTによる周波数フィルタリング ① 原画像をFFTしてスペクトル表示

② 特定の周波数成分を削除

③ IFFTにより画像を復元

Page 9: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

課題1

• 任意の周波数を持つ正弦波画像を作成する

• 画像に正弦波を付加する

Page 10: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

課題2

• 作成した画像をFFTし,周波数スペクトルを表示する

Page 11: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

課題1

• 任意の周波数を持つ正弦波画像を作成する

• 画像に正弦波を付加する

Page 12: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

main関数の仕様

//画像を作成する関数を呼びだす.

//画像番号0に画像を作成する.

make_original_image(0);

//作成した画像(0)を保存する

save_image(0,"");

Page 13: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

ヘッダとプロトタイプ宣言の追加

#include "pgmlib.h" //sin等の数学関数が必要なためmath.hをincludeする #include <math.h> //PIを3.14159265と定義する #define PI 3.14159265 //画像を作成する関数 //nは画像番号を意味する void make_original_image(int n); //二次元正弦波関数の各値を設定する //スライドの式や,教科書p.67の式 void add_sin_waves(int n, double a0, double a, double Nx, double theta_x, double Ny, double theta_y);

Page 14: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

make_original_image関数

void make_original_image(int n){ int i,j; //作成する画像サイズを指定する. //ここでは縦横幅を256pixとする width[n] = 256; height[n] = 256; //全ての画素をゼロにする //pgmlib.hのinit_image関数に相当 for(j = 0;j < height[n];j++){ for(i = 0; i < width[n] ;i++){ image[n][i][j] = 0; } }

Page 15: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

//正弦波を作成する

//void add_sin_waves(int n, double a0, double a,

//double Nx, double theta_x, double Ny, double theta_y);

//add_sin_waves(n, 128.0, 128.0, 256.0, 0.0, 128.0, 0.0);

//add_sin_waves(n, 128.0, 128.0, 64.0, 0.0, 128.0, 0.0);

add_sin_waves(n, 128.0, 128.0, 0.0, 0.0, 128.0, 0.0);

}

Page 16: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

add_sin_waves関数 void add_sin_waves(int n, double a0, double a,

double Nx, double theta_x, double Ny, double theta_y){

int x,y,brightness;

double term_x,term_y,value;

for(y = 0; y < height[n]; y++){

for(x = 0; x < width[n] ;x++){

if(Nx == 0)

term_x = 0.0;

else

term_x=2.0*PI/Nx*(x-theta_x);

if(Ny == 0)

term_y = 0.0;

Page 17: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

else

term_y=2.0*PI/Ny * (y-theta_y);

value = a0+a*sin(term_x + term_y);

brightness = image[n][x][y] + value;

if(brightness > 255)

brightness = 255;

else if(brightness < 0)

brightness = 0;

image[n][x][y] = brightness;

}

}

}

Page 18: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

実行例

• いくつか条件を変更して正弦波画像を作成する

Page 19: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

課題1

• 任意の周波数を持つ正弦波画像を作成する

• 画像に正弦波を付加する

Page 20: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

make_original_image関数を変更 void make_original_image(int n){ int i,j; //作成する画像サイズを指定する. //ここでは縦横幅を256pixとする width[n] = 256; height[n] = 256; //全ての画素をゼロにする //pgmlib.hのinit_image関数に相当 //for(j = 0;j < height[n];j++){ // for(i = 0; i < width[n] ;i++){ // image[n][i][j] = 0; // } //} load_image(0,””);

Page 21: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

add_sin_wavesの条件 add_sin_waves(n, 0 , 64.0, 0.0, 0.0, 32.0, 0.0);

直流バイアス

振幅

(大きすぎると振り切れるので適度に)

周期 下げると高周波数 上げると低周波数

Page 22: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

実行結果

mri2.pgm 出力結果

Page 23: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

課題2

• 作成した画像をFFTし,周波数スペクトルを表示する

Page 24: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

正弦波画像のFFTスペクトル

add_sin_waves(n, 128.0, 128.0, 0.0, 0.0, 6.0, 0.0);

周期Tを変更し複数の画像を作成する

(a) T = 6.0 (b) T = 12.0 (c) T = 48.0

Page 25: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

Scilabによるスペクトル表示

data=csvRead("sin1-spec.csv");

//直流バイアスを削除する場合

data(129,129) = 0;

data=(data-min(data))*255/(max(data)-min(data));

f = scf();

f.color_map = graycolormap(256);

Matplot(data)

Page 26: 2次元フーリエ変換odagaki/ImageProc/src/ppt/...復習 •前回はFFTにより1次元信号の周波数スペク トルを表示した 𝑡=sin2𝜋𝑓1t+sin (2𝜋𝑓2t)

T=6の周波数スペクトル

正弦波のスペクトルが出現