1.傅里叶变换与频域

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

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

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

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

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

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

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

[plain] view plain copy

正在上传…重新上传取消正在上传…重新上传取消

  1. g = fft2(f);

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

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

[plain] view plain copy

正在上传…重新上传取消正在上传…重新上传取消

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

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

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

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

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

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

[plain] view plain copy

正在上传…重新上传取消正在上传…重新上传取消

  1. [M,N] = size(f);
  2. P = 2*M;
  3. Q = 2*N;
  4. fc = zeros(M,N);
  5. for x = 1:1:M
  6. for y = 1:1:N
  7. fc(x,y) = f(x,y) * (-1)^(x+y);
  8. end
  9. end
  10. 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');

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

  1. matlab图像低通滤波器 实验报告,基于matlab数字图像处理之低通滤波器

    <基于matlab数字图像处理之低通滤波器>由会员分享,可在线阅读,更多相关<基于matlab数字图像处理之低通滤波器(6页珍藏版)>请在人人文库网上搜索. 1.实践一:理想低 ...

  2. 数字图像处理-频率域滤波原理

    from:https://blog.csdn.net/forrest02/article/details/55510711?locationNum=15&fps=1 写在前面的话 作者是一名在 ...

  3. 数字图像处理学习笔记之一 DIP绪论与MATLAB基础

    写在前面的话 数字图像处理系列的学习笔记是作者结合上海大学计算机学院<数字图像处理>课程的学习所做的笔记,使用参考书籍为<冈萨雷斯数字图像处理(第二版)(MATLAB版)>,同 ...

  4. 【红外技术】非均匀校正之两点校正(原理标定方法MATLAB代码效果)

    创作时间:2022-05-06 非均匀校正之两点校正(原理&MATLAB代码&效果) 目录: 1.原理&标定方法 2.代码 3.效果 正文: 先看下效果 1.原理 红外焦平面的 ...

  5. 【遥感数字图像处理】实验:遥感图像分析方法大全(Erdas版)

    一.实验目的: 掌握遥感数字图像分析的机理与方法,理解遥感数字图像分析在遥感图像计算机自动解译中的重要作用. 二.实验平台:ERDAS IMAGINE 9.1 三.实验要求:掌握遥感数字图像的邻域分析 ...

  6. 数字图像处理---LOG算子和CANNY算子边缘提取(matlab)

    LOG算子和CANNY算子边缘提取 边缘的含义: 在数字图像中,边缘是指图像局部变化最显著的部分,边缘主要存在于目标与目标,目标与背景之间,是图像局部特性的不连续性,如灰度的突变.纹理结构的突变.颜色 ...

  7. 【数字图像处理】实验一图像基本变换(MATLAB实现)

    目录 一.实验意义及目的 二.实验内容 三.Matlab 相关函数介绍 四.参考代码 五.运行结果 六.实验要求 (1)将彩色图像采用不同的灰度化方法实现灰度化: (2)将彩色图像变换到 YCbCr. ...

  8. 数字图像处理 空间域高斯低通滤波 MATLAB实验

    一.原理_空间域高斯低通滤波 高斯低通滤波是一种使用的去噪滤波,可用于去除高斯噪声,且几乎没有振铃现象. 二.步骤 (1)读入原图像lena.bmp并显示: (2)对原图像分别添加高斯噪声,并显示加噪 ...

  9. 图像处理:TDLMS算法原理介绍及MATLAB实现

    一.TDLMS介绍 1.1 算法原理 二维最小均方(two-dimensional least mean square, TDLMS)滤波算法由最小均方误差(least mean square err ...

最新文章

  1. R语言ggplot2可视化自定义图例实战:添加自定义的图例、添加填充色的图例
  2. 总结 | 如何测试你自己的 RubyGem
  3. MFC串口通信上位机(采用静态库编译生成的)不能在其他电脑运行的问题
  4. 由键盘下陷引起的奇怪事件
  5. ExtJs 3 自定义combotree
  6. 【职场】聊聊P5晋升P6之后
  7. Linux下创建软链接
  8. php把excel转化为csv,php xls如何转csv
  9. eclipse 导入项目_JAVA编程实战:坦克大战系列2-坦克如何在eclipse中编写
  10. Discuz! Database Error(2003) notconnect 问题解決
  11. 高速ETC劝大家不要抬杠:真文案鬼才!
  12. 2021高考技能考试成绩查询,2021年临床技能考试成绩出来了!附查询方式
  13. hive中统计某列数组的元素个数
  14. TSP旅行商问题的Hopfield求解过程
  15. 【排列组合】ZSC1076: 数学、不容易系列之三——考新郎
  16. HTML5 FileAPI读取实例---(一)
  17. bootstrap-徽章-链接
  18. 卡巴斯基终身免费用的方法
  19. 2021年苏大计算机考研872真题及解析
  20. 【Love2d从青铜到王者】第四篇:Love2d之LÖVE与移动矩形

热门文章

  1. 国家开放大学计算机应用基础本科形考一,国家开放大学「计算机应用基础(本)」形考任务1-3答案...
  2. 直击痛点,九州云5G专网助力一汽富晟智慧物流建设
  3. 初中英语期中测试软件有哪些,初中英语(下)期中测试卷.doc
  4. C++输入输出流运算符重载
  5. linux安卓usb网络,[原创]在多种系统下通过USB连接android手机上网
  6. Optional 类
  7. 数据库范式概念以及范式分解详解
  8. 海天蚝油《挑战不可能》夏伯渝获年度挑战大奖
  9. 如何免费恢复u盘误删文件?
  10. Stackless Python并发式编程介绍