題目
請撰寫一個程式,讀取張
256 色灰階圖像。計算輸入圖的離散傅立葉轉換結果,並將頻譜大小與相位角度各以灰階 256 色圖像方式呈現出。
實作方法
傅立葉轉換是一對一函數,可以是連續函數或者離散數列,正向傅立葉轉換,是把一個複雜的波,拆解成N個sin和cos組成的波,頻率從0倍到N-1倍,逆向傅立葉轉換,是把N個sin和cos組成的波,頻率從0倍到N-1倍,分別乘上強度、加上相位,再疊加成一個複雜的波。
1.
利用getOptimalDFTSize() 取得大於等於輸入圖的row跟column裡的最小值,且須為2、3、5的次方相乘
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.
分別將row跟column除以2,將區塊重排,讓原點在影像的中央
8.
接著,對傅立葉轉換的圖像進行重排,分成4個區塊,左至右上至下
9.
將左上角和右上角的象限、右上角與左下角的象限交換
10.
利用normalize(),使用0-1間的浮點數將矩陣轉換為可視圖像形式
11.
利用idft() 求逆向傅立葉轉換
執行環境
Visual studio 2017
+ OpenCV 3.4
執行結果
沒有留言:
張貼留言