图像处理之项目---csdn去雾专栏

(一)高斯低通滤波去噪

高斯低通滤波器(Gaussian Low Pass Filter)是一类传递函数为高斯函数的线性平滑滤波器。又由于高斯函数是正态分布的密度函数。因此高斯低通滤波器对于去除服从正态分布(Normal distribution)的噪声非常有效。一维高斯函数和二维高斯函数 (高斯低通滤波器的传递函数) 的表达形式分别如下:

公式中,为标准差,由于图像通常是二维信号,因此图像去噪通常使用二维高斯函数作为传递函数,而高斯函数具有可分离的特性,因此可以先对行进行高斯滤波,再对列进行高斯滤波,这样二维高斯函数就可以降为一维高斯滤波。下图1分别模拟了标准差为10和标准差为50的高斯函数。

图1:不同标准差时的高斯曲线

从上图可以看出,高斯函数的标准差越大,高斯曲线越平滑。去噪能力越强,图像越模糊。

下图2用均值为0方差分别为0.1,0.5,1.0的高斯噪声对原图像进行污染的结果。

图2

高斯滤波的实现方式有时域方式和频域方式两种,一种是时域高斯低通滤波,一种是频域高斯低通滤波。下面首先看看时域高斯低通滤波的结果。时域高斯低通滤波的实质是定义一个奇数大小的模板(3 X 3 ;5 X 5 ;7 X 7 ……),然后让该模板遍历整副图像,模板中的加权平均值就是模板中心的值。时域高斯低通滤波的结果如下图所示:

图3:不同的标准差和领域大小时的去噪后的图像

从上图可以看出,当领域窗口固定时,标准差越大,去除高斯噪声能力越强,图像越模糊,当标准差为2以上时,去噪能力几乎不再增加,只有当增加领域的大小时,去噪能力才会进一步增强。下面我们可以看一下,标准差分别为10和30的高斯曲线来进一步说明在邻域窗口大小一致的情况下,标准差越大,高斯曲线越宽,那么去高频噪声的能力就越强。但是他不是无限增强的,最终会趋于一个稳定值,只有当继续增大邻域窗口时,去噪能力才会进一步增强。

图4:不同标准差时的高斯曲线

上述时域高斯低通滤波的matlab源代码如下:

[plain] view plaincopyprint?

  1. %时域高斯低通去噪
  2. x = imread(‘NoiseImage.jpg‘);
  3. subplot(231),imshow(x);title(‘高斯噪声为0.1的原图‘)
  4. y1 = fspecial(‘gaussian‘,5,0.1);
  5. z1 = imfilter(x,y1,‘symmetric‘);
  6. subplot(232),imshow(z1);title(‘领域窗口大小为5X5,标准差为0.1‘);
  7. y2 = fspecial(‘gaussian‘,5,2);
  8. z2 = imfilter(x,y2,‘symmetric‘);
  9. subplot(233),imshow(z2);title(‘领域窗口大小为5X5,标准差为2‘);
  10. y3 = fspecial(‘gaussian‘,5,3);
  11. z3 = imfilter(x,y3,‘symmetric‘);
  12. subplot(234),imshow(z3);title(‘领域窗口大小为5X5,标准差为3‘);
  13. y4 = fspecial(‘gaussian‘,5,5);
  14. z4 = imfilter(x,y4,‘symmetric‘);
  15. subplot(235),imshow(z4);title(‘领域窗口大小为5X5,标准差为5‘);
  16. y4 = fspecial(‘gaussian‘,11,5);
  17. z4 = imfilter(x,y4,‘symmetric‘);
  18. subplot(236),imshow(z4);title(‘领域窗口大小为11X11,标准差为5‘);

下面实现频域高斯低通滤波器

由于时域滤波的本质就是采用原始图像与滤波核(领域窗口)进行卷积的操作,我们知道卷积的运算速度是比较慢的,由傅里叶变换的性质可知,时域卷积可以转化为频域的乘积。因而频域高斯低通滤波应运而生。该部分内容基本源于冈萨雷斯版数字图像处理中第四章的内容,为了避免抄书,这里仅给出与时域滤波有相似结果的频域滤波的matlab源代码。

频域高斯低通滤波器的传递函数为:;Matlab自带了低通滤波器函数lpfilter;它的源代码如下:

[plain] view plaincopyprint?

  1. function H = lpfilter(type, M, N, D0, n)
  2. %LPFILTER Computes frequency domain lowpass filters.
  3. %   H = LPFILTER(TYPE, M, N, D0, n) creates the transfer function of
  4. %   a lowpass filter, H, of the specified TYPE and size (M-by-N). To
  5. %   view the filter as an image or mesh plot, it should be centered
  6. %   using H = fftshift(H).
  7. %
  8. %   Valid values for TYPE, D0, and n are:
  9. %
  10. %   ‘ideal‘    Ideal lowpass filter with cutoff frequency D0. n need
  11. %              not be supplied.  D0 must be positive.
  12. %
  13. %   ‘btw‘      Butterworth lowpass filter of order n, and cutoff
  14. %              D0.  The default value for n is 1.0.  D0 must be
  15. %              positive.
  16. %
  17. %   ‘gaussian‘ Gaussian lowpass filter with cutoff (standard
  18. %              deviation) D0.  n need not be supplied.  D0 must be
  19. %              positive.
  20. [U, V] = dftuv(M, N);
  21. % Compute the distances D(U, V).
  22. D = sqrt(U.^2 + V.^2);
  23. % Begin filter computations.
  24. switch type
  25. case ‘ideal‘
  26. H = double(D <= D0);
  27. case ‘btw‘
  28. if nargin == 4
  29. n = 1;
  30. end
  31. H = 1./(1 + (D./D0).^(2*n));
  32. case ‘gaussian‘
  33. H = exp(-(D.^2)./(2*(D0^2)));
  34. otherwise
  35. error(‘Unknown filter type.‘)
  36. end

为了防止傅里叶变换时由于周期性而导致的相邻周期之间的干扰,需要对输入图像进行0填充,对应于时域滤波中的imfilter函数中的“symmetric”选项。频域中采用paddedsize函数来实现。频域高斯低通滤波的matlab代码如下:

[plain] view plaincopyprint?

  1. f = imread(‘NoiseImage.jpg‘);
  2. subplot(221)
  3. imshow(f);title(‘原图‘)
  4. f_r = f(:,:,1);
  5. f_g = f(:,:,2);
  6. f_b = f(:,:,3);
  7. [M,N] = size(f_r);
  8. sig1 = 50;                                   %%截止频率
  9. PQ = paddedsize(size(f_r));                 %%确定输入图像补0后的边界大小
  10. Fp_r = fft2(f_r,PQ(1),PQ(2));               %% R通道傅里叶变换
  11. Fp_g = fft2(f_g,PQ(1),PQ(2));
  12. Fp_b = fft2(f_b,PQ(1),PQ(2));
  13. Hp1 = lpfilter(‘gaussian‘,PQ(1),PQ(2),2*sig1); %%生成高斯低通滤波,
  14. Gp_r1 = Hp1.*Fp_r;                             %% R通道高斯低通滤波
  15. Gp_g1 = Hp1.*Fp_g;
  16. Gp_b1 = Hp1.*Fp_b;
  17. gp_r1 = real(ifft2(Gp_r1));                    %% 取得R通道的傅里叶反变换;
  18. gp_g1 = real(ifft2(Gp_g1));
  19. gp_b1 = real(ifft2(Gp_b1));
  20. gpc_r1 = gp_r1(1:size(f,1),1:size(f,2));
  21. gpc_g1 = gp_g1(1:size(f,1),1:size(f,2));
  22. gpc_b1 = gp_b1(1:size(f,1),1:size(f,2));
  23. gpc1 = cat(3,gpc_r1,gpc_g1,gpc_b1);
  24. gpc1 = uint8(gpc1);
  25. subplot(222),imshow(gpc1);title(‘截止频率为50的低通滤波‘)
  26. %%下面计算截止频率为30的频域高斯低通滤波
  27. sig2 = 30;
  28. Hp2 = lpfilter(‘gaussian‘,PQ(1),PQ(2),2*sig2); %%生成高斯低通滤波,
  29. Gp_r2 = Hp2.*Fp_r;                             %% R通道高斯低通滤波
  30. Gp_g2 = Hp2.*Fp_g;
  31. Gp_b2 = Hp2.*Fp_b;
  32. gp_r2 = real(ifft2(Gp_r2));                    %% 取得R通道的傅里叶反变换;
  33. gp_g2 = real(ifft2(Gp_g2));
  34. gp_b2 = real(ifft2(Gp_b2));
  35. gpc_r2 = gp_r2(1:size(f,1),1:size(f,2));
  36. gpc_g2 = gp_g2(1:size(f,1),1:size(f,2));
  37. gpc_b2 = gp_b2(1:size(f,1),1:size(f,2));
  38. gpc2 = cat(3,gpc_r2,gpc_g2,gpc_b2);
  39. gpc2 = uint8(gpc2);
  40. subplot(223),imshow(gpc2);title(‘截止频率为30的低通滤波‘)
  41. %%下面计算截止频率为10的频域高斯低通滤波
  42. sig2 = 10;
  43. Hp3 = lpfilter(‘gaussian‘,PQ(1),PQ(2),2*sig2); %%生成高斯低通滤波,
  44. Gp_r3 = Hp3.*Fp_r;                             %% R通道高斯低通滤波
  45. Gp_g3 = Hp3.*Fp_g;
  46. Gp_b3 = Hp3.*Fp_b;
  47. gp_r3 = real(ifft2(Gp_r3));                    %% 取得R通道的傅里叶反变换;
  48. gp_g3 = real(ifft2(Gp_g3));
  49. gp_b3 = real(ifft2(Gp_b3));
  50. gpc_r3 = gp_r3(1:size(f,1),1:size(f,2));
  51. gpc_g3 = gp_g3(1:size(f,1),1:size(f,2));
  52. gpc_b3 = gp_b3(1:size(f,1),1:size(f,2));
  53. gpc3 = cat(3,gpc_r3,gpc_g3,gpc_b3);
  54. gpc3 = uint8(gpc3);
  55. subplot(224),imshow(gpc3);title(‘截止频率为10的低通滤波‘)

仿真结果如下:

高斯低通滤波虽然较为简单,个人觉得将它说的非常明白,还是有些困难,这与自己的表达能力差有很大的关系,以后要养成些博客的习惯,希望能够尽早提高。我还是习惯用时域滤波的方法,频域滤波可以将时域的卷积运算转化为频域乘积运算,然而时域转化为频域过程中的傅里叶计算同样耗费时间。时域运算是领域操作,而频域计算式整体操作,关于时域和频域孰优孰劣还有待进一步考究。

高斯低通滤波应该是最基本的去噪手段,后面将进一步阐述双边滤波去噪、非局部均值去噪,以及核回归用于图像去噪。

-------------------------------------------任何一个理论,无论它是简单还是复杂,都应该将它剖析的非常清楚,这样才有可能将复杂的问题简单化,首先要将自己说服,才有可能让别人信服----------------------------------------------

http://bbs.csdn.net/topics/390872980 暗通道

http://www.csdn.net/tag/%25E5%258E%25BB%25E9%259B%25BE

http://www.csdn.net/article/2014-03-06/2818665-90s-coder-lady/2 浙大90后妹子机器学习

时间: 2024-10-07 22:32:29

图像处理之项目---csdn去雾专栏的相关文章

数字图像处理(二):图像去雾

1.主程序 clear all;clc close all kenlRatio = .01;%窗口大小比例 minAtomsLight = 240; %原始论文中的A最终是取原始像素中的某一个点的像素,我实际上是取的符合条件的所有点的平均值作为A的值. %如果是取一个点,则各通道的A值很有可能全部很接近255,这样的话会造成处理后的图像偏色和出现大量色斑. %原文作者说这个算法对天空部分不需特别处理,我实际发现该算法对有天空的图像的效果一般都不好.天空会出现明显的过渡区域. %作为解决方案,我增

MATLAB图像处理_去雾算法

使用MATLAB进行图像的去雾操作,网上一搜,这方面的东西很多,貌似已然成为研究的一个方向,大牛辈出! 这里仅仅给出一个代码,能实现图像的去雾操作,详细的看后边有没有时间,想自己研究研究. function darktest(filename) %暗影去雾算法 %filename------文件名或文件绝对路径 %用法:darktest('7.png') close all clc w0=0.65; %0.65 乘积因子用来保留一些雾,1时完全去雾 t0=0.1; I=imread(filena

用于图像去雾的优化对比度增强算法

图像去雾哪家强?之前我们已经讨论过了著名的基于暗通道先验的图像去雾(Kaiming He, 2009)算法,如果你用兴趣可以参考: 暗通道优先的图像去雾算法(上) 暗通道优先的图像去雾算法(下) 此外,网上也有很多同道推荐了一篇由韩国学者所发表的研究论文<Optimized contrast enhancement for real-time image and video dehazing>(你也可以从文末参考文献[1]给出的链接中下载到这篇经典论文),其中原作者就提出了一个效果相当不错的图

《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果

本文完全转载:http://www.cnblogs.com/Imageshop/p/3281703.html,再次仅当学习交流使用.. <Single Image Haze Removal Using Dark Channel Prior>一文中图像去雾算法的原理.实现.效果(速度可实时) 本文算法合作联系QQ: 33184777, 非诚勿扰 邮件地址:   [email protected] 最新的效果见 :http://video.sina.com.cn/v/b/124538950-125

高级图像去雾算法的快速实现(转载)

原文:http://blog.csdn.net/laviewpbt/article/details/11555877 最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者何凯明博士,2007年清华大学毕业

OpenCV导向滤波实现(Guided Filter)代码,以及使用颜色先验算法去雾

本文主要介绍导向滤波,但是在网上看这算法还能去雾,不知道是具体是怎么利用导向滤波实现去雾的,希望过来人指点迷津,这快主要是重写了导向滤波应用与彩色图像的部分代码,希望与大家共同交流. 论文主要如下: Kaiming He, Jian Sun, Xiaoou Tang. Single Image Haze Removal Using Dark Channel Prior 大致内容是提出了一个叫做暗原色先验的东西来对有雾图像进行处理,十分巧妙,有兴趣者可以看看.这里使用OpenCV实现文中的去雾算法

暗通道优先的图像去雾算法(下)

书接上文 http://blog.csdn.net/baimafujinji/article/details/27206237 我们已经了解了暗通道图像去雾算法的基本原理,下面我们来编程实现,然后对结果再做一些讨论. 上述代码中调用了几个函数,限于篇幅这里仅给出其中的暗通道处理函数,其余函数读者可以尝试自己写写看,当然其中最关键的就是暗通道处理函数,这也是算法的核心内容. 另外,代码里我们使用了导向滤波函数,导向滤波代码来自何恺明博士,读者可以访问他的网页获得源码,已经论文的原文,链接如下: h

图像去雾算法

题记:——首先交代一下背景,之前一直做FPGA硬件方面的东西,由于业务需要转做图像处理.由一个小白做起,从阅读冈萨雷斯开始了图像处理之路.中间也经历了很多坎坷曲折,不多说了开图. 阅读了一些图像去雾方面的论文与资料,发现大部分都是围绕“何凯明博士(香港大学)提出的暗通道先验理论做研究”,鄙人也拜读了何博士的文章,真是心悦诚服之感. 论文名称为“single image haze removal using dark channel prior” 论文中是这样解释各个参数的:I(X)就是有雾图像(

图像去雾 利用最小值滤波(待改进)

图像去雾 我的个神啊~ 调了这么久终于阶段性"胜利了" -- 利用最小值滤波正确实现图像去雾. 因为是C语言实现,很多细节都要注意,很砸时间--本来看起来很简单的程序,就是有bug,debug的时间很长了,这也是一种锻炼吧,难得的实战机会.磨C 这把刀这么久了,是该做做具体应用了!刀子是否锋利,要接受考验! 程序很大程度上没有利用OpenCV的一些数据操作的接口,除了图像显示和读取之外,其他的数据处理部分都是自己实现的.这几天的时间全砸进去了~ 暑假哇~时间过的慢点可好~ 由于项目正在