• 图像傅里叶变换


    1. 通俗理解傅里叶变换

    可参考:

    [1] 傅里叶分析之掐死教程

    (图片摘自傅里叶分析之掐死教程

    2. 通俗理解数字图像傅里叶变换

    傅里叶定理指出,任何信号都可以表示成一系列正弦信号的叠加。在一维领域,信号是一维正弦波的叠加,那么在二维领域,就是无数二维平面波的叠加。比如一帧图像,不同点处的灰度值高低起伏变化,傅里叶变换就是用无数二维正弦波来拟合这种灰度值的起伏变化,灰度值的起伏变化平缓的地方,很低频的二维正弦波即可拟合,灰度值的起伏变化很大的地方(比如图像边缘、噪点等),则需要高频二维正弦波才能拟合。刻画一维正弦波只需要一个频率值$u$,刻画二维正弦波则需要两个频率值$(u,v)$。

    例如:

    数字图像傅里叶变换可参考:

    [1] MOOC课程《遥感数字图像处理》第四章 傅里叶变换

    [2] 数字图像处理,冈萨雷斯,第二版,第四章

    [3] 图像的傅里叶变换

    [4] 如何理解 图像傅里叶变换的频谱图

    下图摘自[1],在FFT功率谱图中,高亮度表明该频率特征明显。

    3. 从数学公式的角度理解傅里叶变换 

    本节的公式摘自冈萨雷斯的《数字图像处理》第四章

    3.1 1-Dimensional Fourier transform

    1-D Fourier transform and inverse Fourier transfrom:

                 

     

    Using Euler's formula, Fourier transform can be expressed as

    所以,当我们看到傅里叶变换公式中的$e^{-j2pi mu t}$时,我们应该想到的是一系列不同频率的正弦波。

    傅里叶变换公式可这样理解:所谓傅里叶变换在其数学本质上无非是信号与正弦函数在时间轴上的卷积操作。根据一般的惯例,我们将信号与之作卷积操作的部分称之为卷积核核函数, 因此我们可以从频率分解以外的视角来审视傅里叶变换,可以将其认为是信号与一个参数可变的核函数的卷积操作,其可变的核函数的参数就是频率。(这段话摘自2-D Gabor 滤波器特征提取

    1-D discrete Fourier transform: 

    $x$ is integers, $M$ is the number of samples of $mu$.

    1-D inverse discrete Fourier transform:

    3.2 2-Dimensional Fourier transform

    2-D Fourier transform and inverse Fourier transfrom:

    2-D discrete Fourier transform: 

    4. 用matlab实现傅里叶变换

    傅里叶变换函数:

    function F = FT_peng(I)
    [m,n] = size(I);
    F = zeros(m,n);
    for u = 1:m
        for v = 1:n
            for x = 1:m
                for y = 1:n
                    F(u,v) = F(u,v) + double(I(x,y)) * exp(-2*pi*1i*(u*x/m+v*y/n));
                end
            end
        end
    end
    
    end

    傅里叶逆变换函数:

    function f = IFT_peng(I)
    [m,n] = size(I);
    f = zeros(m,n);
    for x = 1:m
        for y = 1:n
            for u = 1:m
                for v = 1:n
                    f(x,y) = f(x,y) + double(I(u,v)) * exp(2*pi*1i*(u*x/m+v*y/n));
                end
            end
        end
    end
    f = f/(m*n);
    end

    主程序代码:

    clear;
    I = imread('test_img.png');
    I = imresize(I, [100,100]);
    I = rgb2gray(I);
    
    % using fft2 directly
    I_fft2 = fft2(I);
    I_fft2 = abs(I_fft2);   % abs将负实数和虚数部分调整为正实数
    I_fft2shift = fftshift(I_fft2);   % 把四个角的高频信息移动到最中间
    I_fft2shift = uint8(I_fft2shift/256);  % 除以256是为了缩小数值,能更好的显示
    
    % using function defined by us
    I_FT = FT_peng(I);
    I_FT2 = abs(I_FT);
    I_FTshift = fftshift(I_FT2);
    I_FTshift = uint8(I_FTshift/256);
    
    % recover the image by inverse Fourier function defined by us
    I_inv = IFT_peng(I_FT);
    I_inv = uint8(I_inv);
    
    % plot
    subplot(221);
    imshow(I); title('Original image');
    subplot(222);
    imshow(I_fft2shift); title('fft2 frequency image');
    subplot(223);
    imshow(I_FTshift); title('FT frequency image');
    subplot(224);
    imshow(I_inv); title('Recovered image');

    运行结果:

    注:程序参考了博客2D离散傅里叶变换及逆变换的matlab实现

  • 相关阅读:
    docker
    ibus
    看懂gradle
    tcp
    这丫头也的还真清楚,但是跑不通呢,换3.0.3的mybatis也不行
    lsb_release -a
    js中的整型都是用double存储的,有时候不精确,如,
    浏览器缓存及优化
    web即时通信技术
    css 变量
  • 原文地址:https://www.cnblogs.com/picassooo/p/13359790.html
Copyright © 2020-2023  润新知