2019年5月15日 星期三

s1051771 朱堃煌 作業三

作業3離散傅立葉轉換 DFT 練習

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


一.原理

利用opencv自带的函数dft实行傅里叶转换,然后使用magnitude()得出频谱图,phase()得出相位图。


二.实现

<1>dft()

C++: void dft(InputArray src, OutputArray dst, int flags=0, int nonzeroRows=0);
 
. InputArray src: 输入图像,可以是实数或虚数
. OutputArray dst: 输出图像,其大小和类型取决于第三个参数flags
. int flags = 0: 转换的标识符,有默认值0.其可取的值如下所示:
。DFT_INVERSE: 用一维或二维逆变换取代默认的正向变换
。DFT_SCALE: 缩放比例标识符,根据数据元素个数平均求出其缩放结果,如有N个元素,则输出结果以1/N缩放输出,常与DFT_INVERSE搭配使用。
。DFT_ROWS: 对输入矩阵的每行进行正向或反向的傅里叶变换;此标识符可在处理多种适量的的时候用于减小资源的开销,这些处理常常是三维或高维变换等复杂操作。
。DFT_COMPLEX_OUTPUT: 对一维或二维的实数数组进行正向变换,这样的结果虽然是复数阵列,但拥有复数的共轭对称性(CCS),可以以一个和原数组尺寸大小相同的实数数组进行填充,这是最快的选择也是函数默认的方法。你可能想要得到一个全尺寸的复数数组(像简单光谱分析等等),通过设置标志位可以使函数生成一个全尺寸的复数输出数组。
。DFT_REAL_OUTPUT: 对一维二维复数数组进行逆向变换,这样的结果通常是一个尺寸相同的复数矩阵,但是如果输入矩阵有复数的共轭对称性(比如是一个带有DFT_COMPLEX_OUTPUT标识符的正变换结果),便会输出实数矩阵。
. int nonzeroRows = 0: 当这个参数不为0,函数会假设只有输入数组(没有设置DFT_INVERSE)的第一行或第一个输出数组(设置了DFT_INVERSE)包含非零值。这样的话函数就可以对其他的行进行更高效的处理节省一些时间,这项技术尤其是在采用DFT计算矩阵卷积时非常有效。

<2>magnitude()

C++: void magnitude(InputArray x, InputArray y, OutputArray magnitude);

. InputArray x: 浮点型数组的x坐标矢量,也就是实部
. InputArray y: 浮点型数组的y坐标矢量,必须和x尺寸相同
. OutputArray magnitude: 与x类型和尺寸相同的输出数组
其计算公式如下:
 (取自CSDN) 


<3>
   在进行傅里叶转换之后,应使用magJ.convertTo(magJ, CV_8U, 255); 将图像进行转换,才能使用Imshow。

<4>运行

 原图:


















 相位图:



频谱图:

沒有留言:

張貼留言