数字图像处理之低通滤波器实现原理及方法(Matlab)

article/2025/9/13 22:50:00

1.傅里叶变换与频域

 

        在之前的文中,我们已经进行过一些基本的图像处理。比如,使用低通滤波可以将图像模糊,也有些许降噪的作用。这些都是在空间域内进行的滤波处理,这个处理主要是依靠卷积来进行计算的。首先,从连续的一维卷积入手,如下所示。

       将上式进行傅里叶变换,可以得到如下结果。

        从这个式子,我们可以得到一个重要的结论。也就是,函数卷积的傅里叶变换所得到的结果,是函数的傅里叶变换的乘积。再将其总结得简单易懂一些,有如下结论。

        在将其扩展到二维的形况下,假设尺寸为MxN的图像,如下关系是成立的。

       其实到这,基本的原理就明了的。我们所看到的图像,均为空间域内的表现形式,我们无法辨识出频域内的图像。要进行频域内的滤波器处理,首先就需要进行傅里叶变换,然后直接进行滤波处理,最后再用反傅里叶变换倒回到空间域内。

       到此,已经可以开始空间域内的滤波处理了。但是,还有一点需要注意的地方。使用某个一维信号来举例子,一维信号的傅里叶变换是以2π为周期的函数。所以,我们常常使用的范围[-π,π]来表示这个信号的傅里叶变换,如下所示。

        这样做的好处是,靠近0的成分就是低频,靠近-π与π的成分就表示高频。而对于图像而言,在Matlab中,我们使用fft2()这个函数来求取图像的傅里叶变换。

 

[plain] view plain copy

  CODE_ico.pnguploading.4e448015.gif正在上传…重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif正在上传…重新上传取消派生到我的代码片

  1. g = fft2(f);     

        上面这个代码求取的,其实是范围[0,π]内的傅里叶变换。为了方便理解,下图画出了本行代码所求取的图像的傅里叶变换的范围(右)和与其等效的一维傅里叶变换的范围(左)。

 

       很显然,这并不是希望的范围,下面这个代码可以求取[0,2π]内的傅里叶变换。

 

[plain] view plain copy

  CODE_ico.pnguploading.4e448015.gif正在上传…重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif正在上传…重新上传取消派生到我的代码片

  1. P = 2*M;  
  2. Q = 2*N;  
  3. F = fft2(f,P,Q);  

       下图画出了本行代码所求取的图像的傅里叶变换的范围(右)和与其等效的一维傅里叶变换的范围(左)。所得到的图像F(u,v)的尺寸为PxQ。

 

         我们需要对其移动一下,如下图所示,我们需要的是粉色范围的区域。

下面,从数学上分析一下,如何获得这个部分的频谱。对于傅里叶变换,有如下性质。

这个特性称为平移特性,粉色部分的频谱,将带入上式,我们可以得到如下式子。

为次,我们已经得到了粉色范围的频谱。越靠近傅里叶频谱图像中间的成分,代表了低频成分。其Matlab代码如下所示。

 

[plain] view plain copy

  CODE_ico.pnguploading.4e448015.gif正在上传…重新上传取消在CODE上查看代码片ico_fork.svguploading.4e448015.gif正在上传…重新上传取消派生到我的代码片

  1. [M,N] = size(f);  
  2. P = 2*M;  
  3. Q = 2*N;  
  4. fc = zeros(M,N);  
  5.   
  6. for x = 1:1:M  
  7.     for y = 1:1:N  
  8.         fc(x,y) = f(x,y) * (-1)^(x+y);  
  9.     end  
  10. end  
  11.   
  12. F = fft2(fc,P,Q);  

 

        代码所得到的结果,如下图所示。

        接下来,我们总结一下频域滤波的步骤:

        ①:先将图像做频域内的水平移动,然后求原图像f(x,y)的DFT,得到其图像的傅里叶谱F(u,v)。

        ②:与频域滤波器做乘积,

        ③:求取G(u,v)的IDFT,然后再将图像做频域内的水平移动(移动回去),其结果可能存在寄生的虚数,此时忽略即可。

        ④:这里使用ifft2函数进行IDFT变换,得到的图像的尺寸为PxQ。切取左上角的MxN的图像,就能得到结果了。

 

        2.低通滤波器

        2.1理想的低通滤波器

 

       其中,D0表示通带的半径。D(u,v)的计算方式也就是两点间的距离,很简单就能得到。

       使用低通滤波器所得到的结果如下所示。低通滤波器滤除了高频成分,所以使得图像模糊。由于理想低通滤波器的过度特性过于急峻,所以会产生了振铃现象。

         

 

        2.2巴特沃斯低通滤波器

 

       同样的,D0表示通带的半径,n表示的是巴特沃斯滤波器的次数。随着次数的增加,振铃现象会越来越明显。

 

   

       2.3高斯低通滤波器

       D0表示通带的半径。高斯滤波器的过度特性非常平坦,因此是不会产生振铃现象的。

 

       3.实现代码

 

   123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
 

close all;

clear all;

%% ---------Butterworth Lowpass Filters (Fre. Domain)------------

f = imread('characters_test_pattern.tif');

f = mat2gray(f,[0 255]);

[M,N] = size(f);

P = 2*M;

Q = 2*N;

fc = zeros(M,N);

for x = 1:1:M

for y = 1:1:N

fc(x,y) = f(x,y) * (-1)^(x+y);

end

end

F = fft2(fc,P,Q);

H_1 = zeros(P,Q);

H_2 = zeros(P,Q);

for x = (-P/2):1:(P/2)-1

for y = (-Q/2):1:(Q/2)-1

D = (x^2 + y^2)^(0.5);

D_0 = 100;

H_1(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^2);

H_2(x+(P/2)+1,y+(Q/2)+1) = 1/(1+(D/D_0)^6);

end

end

G_1 = H_1 .* F;

G_2 = H_2 .* F;

g_1 = real(ifft2(G_1));

g_1 = g_1(1:1:M,1:1:N);

g_2 = real(ifft2(G_2));

g_2 = g_2(1:1:M,1:1:N);

for x = 1:1:M

for y = 1:1:N

g_1(x,y) = g_1(x,y) * (-1)^(x+y);

g_2(x,y) = g_2(x,y) * (-1)^(x+y);

end

end

%% -----show-------

figure();

subplot(1,2,1);

imshow(f,[0 1]);

xlabel('a).Original Image');

subplot(1,2,2);

imshow(log(1 + abs(F)),[ ]);

xlabel('b).Fourier spectrum of a');

figure();

subplot(1,2,1);

imshow(H_1,[0 1]);

xlabel('c)Butterworth Lowpass (D_{0}=100,n=1)');

subplot(1,2,2);

h = mesh(1:20:P,1:20:Q,H_1(1:20:P,1:20:Q));

set(h,'EdgeColor','k');

axis([0 P 0 Q 0 1]);

xlabel('u');ylabel('v');

zlabel('|H(u,v)|');

figure();

subplot(1,2,1);

imshow(log(1 + abs(G_1)),[ ]);

xlabel('d).Result of filtering using c');

subplot(1,2,2);

imshow(g_1,[0 1]);

xlabel('e).Result image');

figure();

subplot(1,2,1);

imshow(H_2,[0 1]);

xlabel('f).Butterworth Lowpass (D_{0}=100,n=3)');

subplot(1,2,2);

h = mesh(1:20:P,1:20:Q,H_2(1:20:P,1:20:Q));

set(h,'EdgeColor','k');

axis([0 P 0 Q 0 1]);

xlabel('u');ylabel('v');

zlabel('|H(u,v)|');

figure();

subplot(1,2,1);

imshow(log(1 + abs(G_2)),[ ]);

xlabel('g).Result of filtering using e');

subplot(1,2,2);

imshow(g_2,[0 1]);

xlabel('h).Result image');

 来自CODE的代码片

Butterworth_Lowpass_Filters.m

   123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
 

close all;

clear all;

clc;

%% ---------Gaussian Lowpass Filters (Fre. Domain)------------

f = imread('characters_test_pattern.tif');

f = mat2gray(f,[0 255]);

[M,N] = size(f);

P = 2*M;

Q = 2*N;

fc = zeros(M,N);

for x = 1:1:M

for y = 1:1:N

fc(x,y) = f(x,y) * (-1)^(x+y);

end

end

F = fft2(fc,P,Q);

H_1 = zeros(P,Q);

H_2 = zeros(P,Q);

for x = (-P/2):1:(P/2)-1

for y = (-Q/2):1:(Q/2)-1

D = (x^2 + y^2)^(0.5);

D_0 = 60;

H_1(x+(P/2)+1,y+(Q/2)+1) = exp(-(D*D)/(2*D_0*D_0));

D_0 = 160;

H_2(x+(P/2)+1,y+(Q/2)+1) = exp(-(D*D)/(2*D_0*D_0));

end

end

G_1 = H_1 .* F;

G_2 = H_2 .* F;

g_1 = real(ifft2(G_1));

g_1 = g_1(1:1:M,1:1:N);

g_2 = real(ifft2(G_2));

g_2 = g_2(1:1:M,1:1:N);

for x = 1:1:M

for y = 1:1:N

g_1(x,y) = g_1(x,y) * (-1)^(x+y);

g_2(x,y) = g_2(x,y) * (-1)^(x+y);

end

end

%% -----show-------

close all;

figure();

subplot(1,2,1);

imshow(f,[0 1]);

xlabel('a).Original Image');

subplot(1,2,2);

imshow(log(1 + abs(F)),[ ]);

xlabel('b).Fourier spectrum of a');

figure();

subplot(1,2,1);

imshow(H_1,[0 1]);

xlabel('c)Gaussian Lowpass (D_{0}=60)');

subplot(1,2,2);

h = mesh(1:20:P,1:20:Q,H_1(1:20:P,1:20:Q));

set(h,'EdgeColor','k');

axis([0 P 0 Q 0 1]);

xlabel('u');ylabel('v');

zlabel('|H(u,v)|');

figure();

subplot(1,2,1);

imshow(log(1 + abs(G_1)),[ ]);

xlabel('d).Result of filtering using c');

subplot(1,2,2);

imshow(g_1,[0 1]);

xlabel('e).Result image');

figure();

subplot(1,2,1);

imshow(H_2,[0 1]);

xlabel('f).Gaussian Lowpass (D_{0}=160)');

subplot(1,2,2);

h = mesh(1:20:P,1:20:Q,H_2(1:20:P,1:20:Q));

set(h,'EdgeColor','k');

axis([0 P 0 Q 0 1]);

xlabel('u');ylabel('v');

zlabel('|H(u,v)|');

figure();

subplot(1,2,1);

imshow(log(1 + abs(G_2)),[ ]);

xlabel('g).Result of filtering using e');

subplot(1,2,2);

imshow(g_2,[0 1]);

xlabel('h).Result image');

 来自CODE的代码片

Gaussian_Lowpass_Filters.m

  1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
 

close all;

clear all;

%% ---------Ideal Lowpass Filters (Fre. Domain)------------

f = imread('characters_test_pattern.tif');

f = mat2gray(f,[0 255]);

[M,N] = size(f);

P = 2*M;

Q = 2*N;

fc = zeros(M,N);

for x = 1:1:M

for y = 1:1:N

fc(x,y) = f(x,y) * (-1)^(x+y);

end

end

F = fft2(fc,P,Q);

H_1 = zeros(P,Q);

H_2 = zeros(P,Q);

for x = (-P/2):1:(P/2)-1

for y = (-Q/2):1:(Q/2)-1

D = (x^2 + y^2)^(0.5);

if(D <= 60) H_1(x+(P/2)+1,y+(Q/2)+1) = 1; end

if(D <= 160) H_2(x+(P/2)+1,y+(Q/2)+1) = 1; end

end

end

G_1 = H_1 .* F;

G_2 = H_2 .* F;

g_1 = real(ifft2(G_1));

g_1 = g_1(1:1:M,1:1:N);

g_2 = real(ifft2(G_2));

g_2 = g_2(1:1:M,1:1:N);

for x = 1:1:M

for y = 1:1:N

g_1(x,y) = g_1(x,y) * (-1)^(x+y);

g_2(x,y) = g_2(x,y) * (-1)^(x+y);

end

end

%% -----show-------

figure();

subplot(1,2,1);

imshow(f,[0 1]);

xlabel('a).Original Image');

subplot(1,2,2);

imshow(log(1 + abs(F)),[ ]);

xlabel('b).Fourier spectrum of a');

figure();

subplot(1,2,1);

imshow(H_1,[0 1]);

xlabel('c).Ideal Lowpass filter(D=60)');

subplot(1,2,2);

h = mesh(1:20:P,1:20:Q,H_1(1:20:P,1:20:Q));

set(h,'EdgeColor','k');

axis([0 P 0 Q 0 1]);

xlabel('u');ylabel('v');

zlabel('|H(u,v)|');

figure();

subplot(1,2,1);

imshow(log(1 + abs(G_1)),[ ]);

xlabel('d).Result of filtering using c');

subplot(1,2,2);

imshow(g_1,[0 1]);

xlabel('e).Result image');

figure();

subplot(1,2,1);

imshow(H_2,[0 1]);

xlabel('f).Ideal Lowpass filter(D=160)');

subplot(1,2,2);

h = mesh(1:20:P,1:20:Q,H_2(1:20:P,1:20:Q));

set(h,'EdgeColor','k');

axis([0 P 0 Q 0 1]);

xlabel('u');ylabel('v');

zlabel('|H(u,v)|');

figure();

subplot(1,2,1);

imshow(log(1 + abs(G_2)),[ ]);

xlabel('g).Result of filtering using e');

subplot(1,2,2);

imshow(g_2,[0 1]);

xlabel('h).Result image');


http://chatgpt.dhexx.cn/article/LjUC82kk.shtml

相关文章

滤波器_理想低通/高通滤波器原理

1.滤波器作用 消除干扰杂讯噪声&#xff0c;对信号进行频率成分的选择2.高通滤波 过滤低频信息&#xff0c;让高频信息通过3.低通滤波 过滤高频信息&#xff0c;让低频信息通过4.理想低通滤波 D0表示通带半径&#xff0c;D(u&#xff0c;v)是到频谱中心的距离(欧式距离),公式…

带通滤波器电路图大全(三款带通滤波器电路设计原理图详解)

带通滤波器电路图设计&#xff08;一&#xff09; 传统的带通滤波器设计方法中涉及了很多复杂的理论分析和计算。针对上述缺点&#xff0c;介绍一种使用EDA软件进行带通滤波器的设计方案&#xff0c;详细阐述了使用FilterPro软件进行有源带通滤波器电路的设计步骤&#xff0c;…

T滤波器(低通滤波器)

1.电路原理 T滤波器&#xff0c;其基本原理是基于低通滤波器设计&#xff0c;实现阻高频通低频的需求&#xff0c;其电路图及传递函数如下。 2.传递函数 r(t)为输入,c(t)为输出&#xff0c;从电路原理我们得到输入输出公式&#xff1a; 将公式进行拉氏变换得到&#xff1a; 3.系…

低通滤波器和高通滤波器的程序实现原理推导

傅立叶变换,拉普拉斯变换和Z变换 对于信号分析而言,傅立叶变换是必不可少的,我们都知道傅立叶变换是把系统从时域变换到频域进行分析,那么拉普拉斯变换和Z变换是干什么的?简单的来说,由于傅里叶变换的收敛有一个狄利克雷条件&#xff0c;要求信号绝对可积/绝对可和。对于那些…

数字低通滤波器的原理及实现

首先说一下&#xff0c;数字滤波器是怎么实现的 1.首先根据电路建立低通滤波器时域系统微分方程&#xff0c;得出低通滤波器t域模型 2.其次将对时域微分方程进行拉式变换&#xff0c;得出低通滤波器的s域模型 3.将模拟滤波器转换为数字滤波器&#xff0c;对连续系统进行离散化…

简单易理解的RC滤波器(含电路仿真)

滤波器 滤波器是对波进行过滤的器件&#xff0c;是一种让某一频带内信号通过&#xff0c;同时又阻止这一频带外信号通过的电路。 滤波器主要有低通滤波器、高通滤波器和带通滤波器三种&#xff0c;按照电路工作原理又可分为无源和有源滤波器两大类。本文主要对低通、高通还有带…

一文读懂:常见低通、高通、带通三种滤波器的工作原理

滤波器 滤波器是对波进行过滤的器件&#xff0c;是一种让某一频带内信号通过&#xff0c;同时又阻止这一频带外信号通过的电路。 滤波器主要有低通滤波器、高通滤波器和带通滤波器三种&#xff0c;按照电路工作原理又可分为无源和有源滤波器两大类。今天&#xff0c;小编主要…

利用Excel对数据进行标准化处理

采用的公式为x&#xff08;x-min&#xff09;/(Max-min),这样标准化后的数据最大值为1&#xff0c;最小值为0。

数据分析-数据规范化的一些方法

数据规范化的几种方法 1. Min-Max规范化 from sklearn import preprocessing import numpy as np #初始化数据&#xff0c;每一行表示一个样本&#xff0c;每一列表示为一个特征 x np.array([[0.,-3.,1.],[3.,1.,2.],[0.,1.,-1.] ]) #将数据进行[0,1]规范化 min_max_scaler …

数据预处理(四)——数据标准化

主要内容&#xff1a; 数据预处理的必要性 数据清洗 数据集成 数据标准化 数据规约 数据变换与离散化 利用sklearn进行数据预处理 小结 四、数据标准化 不同特征之间往往具有不同的量纲&#xff0c;由此造成数值间的差异很大。因此为了消除特征之间量纲和取值范围的差异可能会造…

数据的标准化处理——基于python

数据的标准化处理——基于R 归一化&#xff08;normalization&#xff09;python实现 标准化python实现 之前写过用R来进行标准化&#xff1a; 数据的标准化处理——基于R 归一化&#xff08;normalization&#xff09; 将数据缩放到[0,1]的&#xff08;min—max Normalizati…

数据标准化实施

1.数据标准分类及制定 &#xff08;1&#xff09;数据标准的概念 数据标准&#xff1a;数据是企业资产。识别和定义业务数据&#xff0c;对关键数据制定并发布企业范围内的数据定义和标准。每一数据都有唯一指派的拥有者&#xff0c;负责定义数据的使用规则和保护规则。 根据…

python数据预处理 :数据标准化

何为标准化&#xff1a; 在数据分析之前&#xff0c;我们通常需要先将数据标准化&#xff08;normalization&#xff09;&#xff0c;利用标准化后的数据进行数据分析。数据标准化也就是统计数据的指数化。数据标准化处理主要包括数据同趋化处理和无量纲化处理两个方面。数据同…

数据处理标准化方法

归一化&#xff08;Normalization&#xff09; 1.把数据变为&#xff08;0&#xff0c;1&#xff09;之间的小数。主要是为了方便数据处理&#xff0c;因为将数据映射到0&#xff5e;1范围之内&#xff0c;可以使处理过程更加便捷、快速。 2.把有量纲表达式变换为无量纲表达式&…

6 EXCEl格式标准化规范化

1 数值文本转数值 2 查找替换 使用SUBSTITUTE(B10,".","/") 3日期格式规范化 TEXT(F3,"##-##-00") 1数据-分列 最后选择日期 2TEXT(J3,"##-##-00") 4 格式刷

数据的标准化

数据的标准化 数据的标准化&#xff08;normalization&#xff09;是将数据按比例缩放&#xff0c;使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到&#xff0c;去除数据的单位限制&#xff0c;将其转化为无量纲的纯数值&#xff0c;便于不同单位或量级的指…

数据标准化处理

一、为什么进行标准化处理 在多指标评价体系中&#xff0c;由于各评价指标的性质不同&#xff0c;通常具有不同的量纲和数量级。当各指标间的水平相差很大时&#xff0c;如果直接用原始指标值进行分析&#xff0c;就会突出数值较高的指标在综合分析中的作用&#xff0c;相对削…

excel数据标准化

##加载程序包 from openpyxl import load_workbook #利用openpyxl程序包向指定excel单元格写入值 from sklearn.preprocessing import StandardScaler #利用StandardScaler数据标准化处理 import pandas as pd #利用pandas加载excel&#xff0c;得到dataframe结构 dataset pd.…

vue导出excel并修改表头样式

vue导出excel并修改样式 本文参考CSDN蓝色的落叶&#xff08;侵删&#xff09; DEMO下载 安装插件 npm install --save xlsx(修改样式需要下载npm install --save xlsx-style) npm install -S file-saver npm install -D script-loader 安装npm install --save xlsx-style会出…

vue 实现Excel 导出

前言 数据表格的导出&#xff0c;是实际开发的常见功能&#xff0c;前后端都可以实现表格导出&#xff0c;讲解自己在用的一种。 获取数据源&#xff0c;可以通过后端接口实现&#xff0c;也可以利用分页查询的表格接口来实现。 处理数据&#xff0c;对excel表格的表头&#…