2019年5月13日 星期一

s1042701的作業3


題目
請撰寫一個程式,讀取張 256 色灰階圖像。計算輸入圖的離散傅立葉轉換結果,並將頻譜大小與相位角度各以灰階 256 色圖像方式呈現出。

實作方法
傅立葉轉換是一對一函數,可以是連續函數或者離散數列,正向傅立葉轉換,是把一個複雜的波,拆解成Nsincos組成的波,頻率從0倍到N-1倍,逆向傅立葉轉換,是把Nsincos組成的波,頻率從0倍到N-1倍,分別乘上強度、加上相位,再疊加成一個複雜的波。

1.      利用getOptimalDFTSize() 取得大於等於輸入圖的rowcolumn裡的最小值,且須為235的次方相乘
2.      利用dft()進行傅立葉轉換,此結果可能適合原矩陣
3.      利用split() 分離通道,p [0]為實數部分,planes[1]為虛數部分
4.      利用magnitude() 計算幅度,求p [0] = sqrt((p [0])2 + (p [1]) 2),再進行phase()求出相位。
5.      magnitudeImg.cols = log(1+p[0]),先將實數部分放入magnitudeImg.cols,在使用magnitudeImg.cols += Scalar::all(1); 最後求出log(magnitudeImg.cols, magnitudeImg.cols);
6.      利用magnitudeImg.cols(Rect(0, 0, magnitudeImg.cols.cols & -2, magnitudeImg.cols.rows & -2)),另邊長為偶數
7.      分別將rowcolumn除以2,將區塊重排,讓原點在影像的中央
8.      接著,對傅立葉轉換的圖像進行重排,分成4個區塊,左至右上至下
9.      將左上角和右上角的象限右上角與左下角的象限交換
10.  利用normalize(),使用0-1間的浮點數將矩陣轉換為可視圖像形式
11.  利用idft() 求逆向傅立葉轉換

執行環境
Visual studio 2017 + OpenCV 3.4

執行結果






沒有留言:

張貼留言