使用matlab对图像进行傅里叶变换

原图:3d

0

(0)blog

代码:get

I=imread('1.jpg');input

I=rgb2gray(I);it

I=im2double(I);im

F=fft2(I);数据

F=fftshift(F);top

F=abs(F);db

T=log(F+1);img

figure;

imshow(T,[]);

傅里叶变换:

1

(1)

分析代码:

1. I=imread('1.jpg');

读取图像,很少说了

2. I=rgb2gray(I);

将图像转换为灰度图,若是没有这一步的话,最终获得的傅里叶变换是这个样子的

2

(2)

3. I=im2double(I);

将图像的数据格式转换为double型的,此时图像的数值范围由原来的[0,255],变成了[0,1],其实不进行转换的话,也能够进行傅里叶变换,只是傅里叶变换后的图像会有所不一样,如(3)所示,能够跟图(1)比较一下看看效果,有时候不一样的人得出的傅里叶变换结果不相同,也许就是这个缘由

3

(3)

4. F=fft2(I);

进行傅里叶变换

5. F=fftshift(F);

对傅里叶变换后的图像进行象限转换,没有这一步的话,最终输出的结果是这样的

4

(4)

6. F=abs(F);

求傅里叶变换的模,咱们都知道傅里叶变换后的结果为复数,包含real实部和imag虚部,而abs就是求复数的模,通过这一步,F的类型由复数的double变成了实数的double,若是没有这一步, matlab会给出提示,Warning: Displaying real part of complex input.最终输出的结果以下。

5

(5)

7. T=log(F+1);

通过前几步以后,咱们获得了傅里叶变换的幅值,可是傅里叶变换后的数值范围很是大,maxF = 2.04e+05,minF = 0.009,若是不进行转换的话在图中显示就是图(6)的样子,中间有个小白点

6

(6)

那为何要用log(F+1)呢。如图7所示,对(0,1)之间的x值,通过log(X)变换后会变成负数,而log(X+1)则将全部的x值,映射成正数,数值范围也更小一些。

7

(7)

8. figure;imshow(T,[]);

显示图像,之因此用imshow(T,[]);而不是imshow(T)。是由于即便通过对数变换后T的取值范围仍然大于[0,1],maxT=12.23,minT=0.009。imshow(T)只会显示[0,1]的值,而imshow(T,[]) 会根据灰度图的数值范围来显示图像,至关于将[0.09,12.23]映射到[0,1]显示。

相关文章
相关标签/搜索