数字图像处理笔记(频域滤波)

1 频域滤波

1.1 介绍

  • 任何连续周期信号可以由一组适当的正弦曲线组合而成。

  • 为什么我们要用正弦曲线来代替原来的曲线呢?
    分解信号的目的是为了更加简单地处理原来的信号。而且,用正余弦来表示原信号会更加简单,因为正余弦拥有原信号所不具有的性质:正弦曲线保真度,即一个正弦曲线信号输入后,输出的仍是正弦曲线,只有幅度和相位可能发生变化,但是频率和波的形状仍是一样的。只有正弦曲线才拥有这样的性质,正因如此我们才不用方波或三角波来表示。

  • 傅里叶变换将原来难以处理的时域信号转换成了易于分析的频域信号(信号的频谱),可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用傅立叶逆变换将这些频域信号转换成变换后的时域信号。

  • 频域滤波的基本步骤如下:

  • 代码:F = fft2(I),获得图像的傅里叶变换;Fc = fftshift(F),将变换的原点移动到频率矩形的中心;I = ifft2(F),计算傅里叶逆变换,通常需要加上real(ifft2(F))来提取实部。

  • 示例:

    I = uint8(zeros(500));
    I(140:160, 140:160) = 255;
    subplot(2,2,1), imshow(I), title('原图');
    
    F = fft2(I);
    subplot(2,2,2), imshow(abs(F), []), title('傅里叶频谱');
    
    Fc = fftshift(F);
    subplot(2,2,3), imshow(abs(Fc), []), title('移动变换原点');
    subplot(2,2,4), imshow(log(1+abs(Fc)), []), title('增强显示');
    

1.2 低通滤波

  • 低通滤波让低频信号能正常通过,而超过设定临界值的高频信号则被阻隔、减弱。例如,边缘部分就是高频信号的位置。

  • 示例:

    I = imread('test.jpg');
    I = rgb2gray(I);
    subplot(2,2,1), imshow(I), title('原图');
    
    PQ = paddedsize(size(I));
    [U, V] = dftuv(PQ(1), PQ(2));
    D0 = 0.05*PQ(2);
    F = fft2(I, PQ(1), PQ(2));
    H = exp(-(U.^2 + V.^2) / (2 * (D0^2)));
    g = dftfilt(I, H);
    
    subplot(2,2,2), imshow(fftshift(H)), title('高斯低通滤波器');
    subplot(2,2,3), imshow(log(1 + abs(fftshift(F))), []), title('图像频谱增强显示');
    subplot(2,2,4), imshow(g, []), title('低通滤波结果');
    
    function PQ = paddedsize(AB, CD)
    % 计算填充尺寸以供基于FFT的滤波器
        if nargin == 1
            PQ = 2 * AB;
        elseif nargin == 2 && ~ischar(CD)
            PQ = AB + CD -1;
            PQ = 2 * ceil(PQ / 2);  % ceil(N)返回比N大的最小整数,为了避免出现奇数,因为处理偶数数组快
        elseif nargin == 2
            m = max(AB);
            P = 2 ^ nextpow2(2 * m);  % nextpow2(N)返回第一个P,使得2. ^ P> = abs(N)。 
            % 对于FFT运算,找到最接近两个序列长度的2 的幂次方通常很有用。
            PQ = [P, P];
        elseif nargin == 3
            m = max([AB CD]);
            P = 2 ^ nextpow2(2 * m);
            PQ = [P, P];
        else
            error('Wrong number of input')
        end
    end
    
    function [U, V] = dftuv(M, N)
    % 用来计算到中心的距离
        u = 0:(M - 1);
        v = 0:(N - 1);
        
        idx = find(u > M / 2);
        u(idx) = u(idx) - M;
        idy = find(v > N / 2);
        v(idy) = v(idy) - N;
        
        [V, U] = meshgrid(v, u);
    end
    
    function g = dftfilt(f, H)
    % 频域滤波函数
        F = fft2(f, size(H, 1), size(H, 2));
        g = real(ifft2(H .* F));
        g = g(1:size(f, 1), 1:size(f, 2));
    end
    

在这里插入图片描述

  • 可以看出图像的边缘被平滑了,并且图像周围边界部分多了一圈黑边,是因为之前进行了0填充。
    在这里插入图片描述

1.3 高通滤波

  • 高通滤波让高频信号能正常通过,而低于设定临界值的低频信号则被阻隔、减弱,是低通滤波的对立,是图像锐化的一种方式。
  • 示例:
    I = imread('test.jpg');
    I = rgb2gray(I);
    subplot(2,2,1), imshow(I), title('原图');
    
    PQ = paddedsize(size(I));
    [U, V] = dftuv(PQ(1), PQ(2));
    D0 = 0.05*PQ(2);
    F = fft2(I, PQ(1), PQ(2));
    
    H = exp(-(U.^2 + V.^2) / (2 * (D0^2)));
    Hp = 1 - H;
    g = dftfilt(I, Hp);
    
    subplot(2,2,2), imshow(fftshift(H)), title('高斯高通滤波器');
    subplot(2,2,3), imshow(log(1 + abs(fftshift(F))), []), title('图像频谱增强显示');
    subplot(2,2,4), imshow(g, []), title('高通滤波结果');
    
    Fg = fft2(g, PQ(1), PQ(2));
    figure, subplot(1,2,1), imshow(log(1 + abs(fftshift(F))), []), title('变换前图像频谱');
    subplot(1,2,2), imshow(log(1 + abs(fftshift(Fg))), []), title('变换后图像频谱');
    
    

在这里插入图片描述

  • 可以看出边缘被锐化了。
    在这里插入图片描述
在Python中进行频域滤波可以使用傅里叶变换来实现。首先,通过使用正向傅里叶变换将原始图像从空间域转换到频域。这可以通过NumPy库中的fft函数来实现。接下来,使用频域滤波器对频率进行过滤,保留或去除某些特定频率。常用的频域滤波器包括低通滤波器、高通滤波器和带通滤波器等。最后,使用傅里叶逆变换将滤波后的频域图像重新转换到空间域,得到处理后的图像。 以下是一个使用Python进行频域滤波的示例代码: ```python import numpy as np from scipy.fft import fft, ifft # 假设原始图像为img img = ... # 进行正向傅里叶变换 img_freq = fft(img) # 定义频域滤波器,这里以低通滤波器为例 # 可根据需要选择其他滤波器 filter = ... # 对频域图像进行滤波 filtered_img_freq = img_freq * filter # 进行傅里叶逆变换,得到处理后的图像 filtered_img = ifft(filtered_img_freq) # 处理后的图像即为filtered_img ``` 在上述代码中,首先使用fft函数对原始图像进行正向傅里叶变换得到频域图像。然后,定义一个频域滤波器,可以根据需要选择不同的滤波器类型。通过将频域图像与滤波器进行乘法运算,可以对频域进行滤波。最后,使用ifft函数进行傅里叶逆变换,将滤波后的频域图像转换回空间域,得到处理后的图像。 请注意,示例代码中的滤波器部分需要根据具体需求进行定义和实现。可以根据实际应用的场景选择不同的滤波器类型和参数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [数字图像处理与Python实现笔记频域滤波](https://blog.youkuaiyun.com/qq_40507857/article/details/107609844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值