对于Matlab中FFT变换的思考

来源:互联网 发布:网络数据分析工具解析 编辑:程序博客网 时间:2024/05/18 11:41

以下的FT图像指的是对一幅图像直接进行傅里叶变化后得到的图像,频率矩形指的是平移的最终位置,因为空域的坐标原点就在图像的左上角,所以FT图像的坐标原点也在左上角,但是不幸的是这样转到频率域后我们看到的是以FT图像的原点为中心的四个1/4图像组成的一个频谱图。所以我们有必要将FT的原点从(0,0)平移到频率矩形的左上角即原图的(M/2.N/2)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

预备知识:

1、Matlab的abs()函数对于复数而言是求其模长,所以大家不要感觉到怎么和图像处理课本上的定义不一样了

2、傅里叶变换后的频谱动态范围很大,所以为了全部显示所以的频谱,我们关注的亮度

3、matlab中,我们常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算。在matlab中,为了保证精度,经过了运算的图像矩阵A其数据类型会从unit8型变成double型。如果直接运行imshow(A),我们会发现显示的是一个白色的图像。
这是因为imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0~255范围。而经过运算的范围在0-255之间的double型数据就被不正常得显示为白色图像了。
那么如何解决这个问题呢?通过搜索,找到两个解决方法:
         imshow(I/256); -----------将图像矩阵转化到0-1之间
         imshow(I,[]);       -----------自动调整数据的范围以便于显示 (不明白原理!)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

对于一维函数:未平移前,FT的一个周期是沿原点对称分布的。讨论DFT,假设频率范围为[0,1,……,M-1,M],则DFT的频谱分布在原点0的两侧,左:[M/2,M/2-1,……,0],右侧[0,……,M/2-1,M/2]

同样,将上述道理用于理解二维函数(比如图像数据):FT的中心位于频率矩形的中点——假设u,v为频率自变量,则在u方向的FT和沿v方向的FT是沿原点对称分布的,而原始图像的原点在左上角(故FT图像的原点也在左上角),这就导致一幅图像的FT图像由相邻的四个FT周期的1/4组成,如下图所示:

对傅立叶变换(FT)频谱平移的理解

频谱平移使用fftshift来重排数据,相当于把FT图像的原点移到了频率矩形的原点(左上角),如下图所示:

对傅立叶变换(FT)频谱平移的理解

//关于频率矩形:设u方向的频率范围为[0,M],v方向的频率范围为[0,N],则矩形[(0,0)(M,0)(M,N)(0,N)]即频率矩形。

示例:

图像生成:

>> I=zeros(255,255);

>> I(100:155,100:155)=1;

>> imshow(I)

对傅立叶变换(FT)频谱平移的理解

傅立叶变换并显示幅值谱:

>> F=fft2(I);

>> S=abs(F);figure

>> imshow(S,[])

对傅立叶变换(FT)频谱平移的理解

图上,四个角的亮点是由于FT的周期性导致的结果(分析见上文)。

经过频谱平移后的图像为:

>> Fc=fftshift(F);figure,imshow(abs(Fc),[])

对傅立叶变换(FT)频谱平移的理解

亮度区域不明显,不方便观察——因为频谱的动态范围太大了,与8比特显示(此时中心处的明亮值占支配地位)相比要大得多

可以知道

>> max(max(abs(F)))

ans =

      799680 %此值很大!

为此,可以使用对数变换来压缩动态范围。

>> S2=log(1+abs(Fc));imshow(S2,[])

对傅立叶变换(FT)频谱平移的理解

>> max(max(abs(S2)))

ans =

   13.5920

可以看到,动态范围已降至13.5920,更方便观察与处理。

摘录一段:“对数变换的一项主要应用是压缩动态范围,例如,傅立叶频谱的范围为[0,10^6]或更高,当FT频谱显示于已线性放至8比特的监视器上时,高值部分占优,从而导致频谱中低亮度值的可视细节丢失。通过计算对数,10^6左右的动态范围会降至14。”——Gonzalez《数学图像处理》
0 0
原创粉丝点击