小白学冈萨雷斯数字图像处理——第四章:频域处理

4.1 二维离散傅里叶变换

定义与一维DFT相同,此处不再赘述。

在计算二维傅里叶变换之前,可将f(x,y)*(-1)^(x+y)次,可将原点的变换值移到频谱中心。
在这里插入图片描述

4.2 在MATLAB中计算并可视化二维DFT

下列函数返回M*N的傅里叶变换;数据原点在左上角,而两个四分之一周期交汇于频率矩形的中心。

F = fft2(f)

若需要进行0填充:

F = fft2(f,P,Q)

生成的矩阵大小为P*Q,多余的用0填充。

我们可以使用fftshift函数将变换的原点移到频率矩形的中心,也可用ifftshift将其复原:

Fc = fftshift(F)
F = ifftshift(Fc)

我们可以使用对数变换来使频谱的视觉增强:

S2 = log(1+abs(Fc));

在这里插入图片描述
可用如下函数计算频率矩形的中心点可不必考虑M,N的奇偶性:

[floor(M/2) + 1 , floor(N/2) + 1]

由于浮点计算的舍入误差,傅里叶逆变换的输出会有很小的虚数分量,因此需要计算后取实部:

f = real(ifft2(F));

4.3 频域滤波

4.3.1 基本概念

空间域和频域线性滤波的基础均为卷积定理

频域滤波的目的是选择一个滤波器传递函数,以便按照指定的方式修改F(u,v)。例如,当乘一个低通滤波器时,高频分量会被衰减,而低频分量保持不变,此结果会出现模糊现象(平滑)。

注意:当我们使用DFT进行滤波时,图像及其变换都被看作是具有周期性的。若周期关于函数的非零部分的持续时间很近,则对周期函数执行卷积运算会导致相邻周期之间的干扰,称为折叠误差的干扰。我们可以通过使用0填充函数的方法来避免。
若函数f和h的大小分别为AB和CD,通过选择P>=A+C-1,Q>=B+D-1即可避免折叠误差。

paddedsize函数可计算满足P,Q的最小偶数值(加快FFT速度),还可填充输入图像,使其等于最接近的2的整数次幂。

function PQ = paddedsize(AB, CD, nargin)
% 计算填充尺寸以供基于FFT的滤波器
% nargin = 1   PQ = PADDEDSIZE(AB),AB = [A B], PQ = 2 * AB
%
% nargin = 2   PQ = PADDEDSIZE(AB, 'PWR2'), PQ(1= PQ(2= 2 ^ nextpow2(2 * m), m =
% MAX(AB).
% 
% nargin = 3   PQ = PADDEDSIZE(AB, CD),AB = [A B], CD = [C D]
%
% nargin = 其它 PQ = PADDEDSIZE(AB, CD, 'PWR2'), PQ(1= PQ(2= 2 ^ nextpow2(2 * m), m =
% MAX([AB CD]).

if nargin == 1
    PQ = 2 * AB;
else if nargin == 2 & ~ischar(CD)
    PQ = AB + CD -1;
    PQ = 2 * ceil(PQ / 2);  % ceil(N)返回比N大的最小整数,避免出现奇数
else if nargin == 2
    m = max(AB);
    P = 2 ^ nextpow2(2 * m);  % nextpow2(N)返回第一个P,使得2. ^ P> = abs(N)。 
    % 对于FFT运算,找到最接近两个序列长度的2 的幂次方通常很有用。
    PQ = [P, P];
else if nargin == 3
    m = max([AB CD]);
    P = 2 ^ nextpow2(2 * m);
    PQ = [P, P];
else
    error('Wrong number of input')
end

填充滤波与非填充滤波对比:
在这里插入图片描述

4.2 DFT滤波的基本步骤

(1)使用函数paddedsize获取填充参数

PQ = paddedsize(size(f));

(2)得到使用填充的傅里叶变换

F = fft2(f,PQ(1),PQ(2));

(3)生成滤波函数H

滤波函数大小为PQ(1)*PQ(2) 格式必须如下图b所示
在这里插入图片描述
若是a格式,需用fftshift进行处理。

(4)将变换乘滤波函数

G = H.*F;

(5)获得G的傅里叶逆变换的实部

g = real(ifft2(G));

(6)将左上部的矩阵修剪为原始大小

g = g(1:size(f,1), 1:size(f,2));

4.3 频域滤波

dftfilt函数

g = real(ifft(H.*F));
g = g(1:size(f,1),1:size(f,2));

4.4 从空间滤波器获得频域滤波器

一般,当滤波器较小时,空间滤波比频域滤波更有效。

给定一个空间滤波器h,生成一个频域滤波器H的方法:

H = fft2(h,PQ(1),PQ(2));

但是,这种方法获得的频域滤波器与空间滤波器不等价(使用imfilter的空间滤波,imfilter使用了相关,且滤波原点在中心处)

H = freqz2(h,R,C);

此函数用于计算FIR滤波器的频率响应,结果是我们所希望的频域滤波器。其中,h是一个二维空间滤波器,R为h的行数(R=PQ(1)),C为列数(C=PQ(2))。

4.5 在频域中直接生成滤波器

4.5.1建立用于实现频域滤波器的网格数组

dftuv函数:

function [U, V] = dftuv(M, N)
% DFTUV Computes meshgrid frequency matrices.
% [U, V] = DFTUV(M, N) computes meshgrid frequency matrices U and V. U and
% V are useful for computing frequency-domain filter functions that can be
% used with DFTFILT. U and V are both M-by-N.
% more details to see the textbook Page 93
%
% [U,V] = DFTUV(M,N)计算网格频率矩阵U和V。 U和V对于计算可与DFTFILT一起使用的
% 频域滤波器函数很有用。 U和V都是M-by-N。更多细节见冈萨雷斯教材93% Set up range of variables.
% 设置变量范围
u = 0 : (M - 1);
v = 0 : (N - 1);

% Compute the indices for use in meshgrid.
% 计算网格的索引,即将网络的原点转移到左上角,因为FFT计算时变换的原点在左上角。
idx = find(u > M / 2);
u(idx) = u(idx) - M;
idy = find(v - N / 2);
v(idy) = v(idy) - N;

% Compute the meshgrid arrays.
% 计算网格矩阵
[V, U] = meshgrid(v, u);


4.5.2 低通频域滤波器

H(u,v)= 1 (若D(u,v)<= D0)
H(u,v)= 0 (若D(u,v)> D0)

D0为指定的非负数,D(u,v)为点(u,v)到滤波器中心的距离。D(u,v)=D0的点的轨迹为一个圆。若滤波器H乘一幅图像的傅里叶变换,则理想滤波器切断了圆外F所有的分量,圆内和圆上的值不变。

在这里插入图片描述
高斯低通滤波器:

PQ = paddedsize(size(f));
[U , V] = dftuv(PQ(1),PQ(2));
D0 = 0.05*PQ(2);
F = fft2(f,PQ(1),PQ(2));
H = exp(-(U.^2+V.^2)/(2*D0^2));
g = dftfilt(f,H);
#以图像形式查看该滤波器
figure(),imshow(fftshift(h),[])
#将频谱显示为一幅图像
figure(),imshow(log(1+abs(fftshift(F))),[])
#输出图像
figure(),imshow(g,[]);

高斯低通滤波后的图像与原图像相比要模糊一些。

生成滤波器函数lpfilter():

function [H, D] = lpfilter(type, M, N, D0, n)
% LPFILTER Computes frequency domain lowpass filters
%   H = LPFILTER(TYPE, M, N, D0, n) creates the transfer function of a
%   lowpass filter, H, of the specified TYPE and size (M-by-N). To view the
%   filter as an image or mesh plot, it should be centered using H =
%   fftshift(H)
%   Valid value for TYPE, D0, and n are:
%   'ideal' Ideal lowpass filter with cutoff frequency D0. n need not be
%           supplied. D0 must be positive.
%   'btw'   Butterworth lowpass filter of order n, and cutoff D0. The
%           default value for n is 1.0. D0 must be positive.
%   'gaussian'Gaussian lowpass filter with cutoff (standard deviation) D0.
%           n need not be supplied. D0 must be positive.
%
% 得到指定类型的低通滤波器


[U, V] = dftuv(M, N);
% 计算距离 D(U, V)
D = sqrt(U.^2 + V.^2);
% 滤波计算
switch type
    case 'ideal'
        H = double(D <= D0);
    case 'btw'
        if nargin == 4
            n =1;
        end
        H = 1 ./ (1 + (D ./ D0) .^ (2 * n));
    case 'gaussian'
        H = exp(-(D .^ 2) ./ (2 * (D0 ^ 2)));
    otherwise
        error('Unkown filter type.')
end

4.5.3 线框图与表面图

对于二维函数,使用函数mesh可以绘制线框图

mesh(H(1:k:end,1:k:end))

#默认颜色为彩色
colormap([0 0 0]) %设置为黑色
colormap(gray) %设置为灰色

#开启/关闭 网格/坐标轴
grid on grid off 
axis on axis off

#调节方位角/仰角
view(az,el)

#将函数绘制成表面图来代替线框图
surf(H)

#插值,平滑小面描影并删除网格线
shading interp

4.6 锐化频域滤波器

高通滤波会使图像变得更清晰(锐化)。

4.6.1 基本的高通滤波器

hpfilter()

function H = hpfilter(type, M, N, D0, n)
% LPFILTER Computes frequency domain highpass filters
%   H = HPFILTER(TYPE, M, N, D0, n) creates the transfer function of a
%   highpass filter, H, of the specified TYPE and size (M-by-N). To view the
%   filter as an image or mesh plot, it should be centered using H =
%   fftshift(H)
%   Valid value for TYPE, D0, and n are:
%   'ideal' Ideal highpass filter with cutoff frequency D0. n need not be
%           supplied. D0 must be positive.
%   'btw'   Butterworth highpass filter of order n, and cutoff D0. The
%           default value for n is 1.0. D0 must be positive.
%   'gaussian'Gaussian highpass filter with cutoff (standard deviation) D0.
%           n need not be supplied. D0 must be positive.
% The transfer function Hhp of highpass filter is 1 - Hlp, where Hlp is the
% transfer function of the corresponding lowpass filter. Thus, we can use
% function lpfilter to generate highpass filters.
%
% 计算给定类型(理想、巴特沃斯、高斯)的频域高通滤波器

% Use function dftuv to set up the meshgrid arrays needed for computing the
% required distances.
if nargin == 4
    n = 1;
end
Hlp = lpfilter(type, M, N, D0, n);
H = 1 - Hlp;      

高通滤波:

PQ = paddedsize(size(f));
D0 = 0.05*PQ(1);
H = hpfilter('gaussian',PQ(1),PQ(2),D0);
g = dftfilt(f,H);
figure,imshow(g,[])

在这里插入图片描述

4.6.2 高频强调滤波

普通的高通滤波器偏离直流项,从而把图像的平均值降到了0。一种补偿方法是给高通滤波器加上一个偏移量,若同时将滤波器乘一个大于1的常数,则称为高频强调滤波,因为该常数突出了高频部分。这个乘数也增加了低频部分的幅度,但是只要偏离量与乘数相比较小,低频增强的部分就弱于高频增强的影响。
传递函数为:
在这里插入图片描述
应用:X光片的增强。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44487378/article/details/106224098