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


    原图:

    0

    (0)

    代码:

    I=imread('1.jpg');

    I=rgb2gray(I);

    I=im2double(I);

    F=fft2(I);

    F=fftshift(F);

    F=abs(F);

    T=log(F+1);

    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]显示。

  • 相关阅读:
    元素设置float属性后,其后面的元素的位置问题
    Vue.js经典开源项目汇总
    ES6-模块导入导出
    JavaScript内存泄漏
    父元素高度比子元素高度多几个像素的解决方法
    jasmine —— Spies(转)
    用npm-run自动化任务(转)
    AngularJS中页面传参方法
    Path模块部分常用函数解析——NodeJS
    html特殊字符表
  • 原文地址:https://www.cnblogs.com/sanshanyin/p/5426822.html
Copyright © 2020-2023  润新知