自适应图像降噪滤波器的设计与实现
来源:互联网 发布:ipad网络不稳定 编辑:程序博客网 时间:2024/06/04 23:36
原文:http://blog.csdn.net/baimafujinji/article/details/73302911
有一个说法:好奇心和懒惰是推动人类发明创造的两大动力!所以今天我又再次展现了我的好奇心。何况”我的眼里为什么常含着泪水,因为我有一个算法不会。“ 为了节约一点泪水,还是应该把一些算法搞清楚。
如果说让你对一幅含有噪声的图像进行去噪,你会想到什么最原始、最简单的、教科书上就会讲到的方法。我猜或许应该是Box Filter(也称均值滤波)或者Gaussian Filter,关于Box Filter可以参考本博主之间的一篇文章(文章链接)。但是无论Box Filter还是Gaussian Filter,它们的一个共有的不足就在于对待噪声和图像的纹理细节都采用一视同仁的处理方式,结果导致噪声被去掉的同时,图像的纹理和细节也会被一同磨平。这个Side effect是我们所不想见到的!
于是,几乎所有真正有价值的图像降噪方法都在试图让程序可以自适应地区隔无用的噪声和有用的图像纹理细节,然后再采取不同的处理方式,从而实现details preserving(或者edge preserving)。而且这样的方法还特别特别多,例如比较有名的双边滤波、基于PM方程的各向异性扩散滤波,以及基于TV-norm的去噪方法等等。关于这些内容你也可以参考《图像处理中的数学修炼》一书。在实际中,这些算法都具有非常广泛而重要的用途,例如医学影像处理中常常需要利用数字图像处理的技术对X-ray或者MRI图像等进行降噪,再比如现在手机中比较popular的美颜嫩肤都要以上面提到的那些details preserving的denoise算法。但是,上面提到的那些算法动辄就要用到像偏微分方程或者欧拉-拉格朗日方程等深奥晦涩的数学知识。我们能不能从一个比较简单的方法入手来一窥details preserving的denoise算法的能力和效果呢?这个可以有!
为什么开篇会提到好奇心这个问题呢?因为之前使用MATLAB时都知道其中的图像处理工具箱提供了一个wiener2函数,可以对图像进行降噪。从名字上看来它应该是利用了维纳滤波器来进行降噪的。但具体说它到底是怎么进行去噪的恐怕就很难说得清楚了。所以本文的源起也就是作者设法检视了一下MATLAB中的wiener2函数背后到底搞得什么鬼。例如上面是一张土星照片的局部图像。我们首先向其中加入一些高斯噪声(如下图左所示),然后再利用wiener2函数来对其进行降噪。效果如下图右所示。
可见原图像的纹理(例如图形环和远处的星辰等)都得到了很好的保护,而噪声也得到了有效的降低。但问题又回来了,wiener2函数到底是如何做到这一切的,其背后的原理是什么呢?
我们引入经典教科书中都会使用的一个图像退化模型,并以此作为算法讨论的开始。如下图所示,输入待处理图像
如果
退化函数
- 如果
σ2g=0 ,即整幅图像的噪声方差为零,其实也就相当于噪声为0,而此时公式表示f̂ (x,y)=g(x,y) ,恰好符合。 - 如果
σ̂ 2L>>σ2g ,这其实暗示这个局部包含的图像边缘、纹理、细节较多(因为大于整体噪声方差),而这部分内容是应该被保护的。此时公式变为f̂ (x,y)=g(x,y) ,也就表示不需要做过多处理,也符合我们details preserving的需求。 - 如果
σ̂ 2L≈σ2g ,则有f̂ (x,y)=μ̂ L ,这表明(x,y) 处在一个普通的区域,此时便可以应用普通的均值滤波来做处理。
当然,上面这个算法其实还有一个地方是需要我们加以应对的,那就是我们需要估计
这个方法看起来如此的简单,它真的能按照我们预期的那样工作吗?下面就在MATLAB中编程实现这个算法。
function [f,noise] = mywiener2(g, nhood, noise)if (nargin<3) noise = [];end% Estimate the local mean of f.localMean = filter2(ones(nhood), g) / prod(nhood);% Estimate of the local variance of f.localVar = filter2(ones(nhood), g.^2) / prod(nhood) - localMean.^2;% Estimate the noise power if necessary.if (isempty(noise)) noise = mean2(localVar);end% Compute result% f = localMean + (max(0, localVar - noise) ./ ...% max(localVar, noise)) .* (g - localMean);%% Computation is split up to minimize use of memory for temp arrays.f = g - localMean;g = localVar - noise; g = max(g, 0);f = localMean + ((f ./ max(localVar, noise)) .* g);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
下面来试验一下上面这个看起来只有聊聊几行的简单函数是否可以实现保持图像细节的去噪功能。下面的MATLAB代码调用了上述函数,执行下面的代码将得到本文最开始所展示出来的效果图,而且这与直接调用wiener2函数所得之结果也是完全一致的。
RGB = imread('saturn.png');I = rgb2gray(RGB);I = I(601:1000,1:600);J = imnoise(I,'gaussian',0,0.005);J = im2double(J);K = mywiener2(J,[5 5]);figure;imshow(I), title('original image');figure;subplot(1,2,1), subimage(J), title('noised image');subplot(1,2,2), subimage(K), title('denoised image');
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
更多图像处理中的数学问题请参考《图像处理中的数学修炼》,也欢迎广大读者到图像处理书籍读者群中参与讨论学习,并交流关于图像去噪算法和PDE图像处理算法的研究心得。
- 自适应图像降噪滤波器的设计与实现
- 自适应图像降噪滤波器的设计与实现
- 变换域自适应滤波器的设计与实现
- 图像处理基础(2):自适应中值滤波器(基于OpenCV实现)
- 图像的复原与重建(3):图像去噪(中值、均值、谐波均值、自适应、带通、带阻、陷波滤波器)
- 滤波器设计(4):自适应滤波器之最小均方误差(LMS)滤波器的设计
- 基于FPGA与MATLAB的IIR滤波器设计与实现
- 均值滤波器与中值滤波器的实现
- 基于模型设计的FPGA开发与实现:滤波器设计与实现(一)在Matlab中高效设计滤波器
- 基于Matlab的FIR滤波器设计与实现
- 基于Matlab的FIR滤波器设计与实现
- 基于Matlab的FIR滤波器设计与实现
- 滤波器的使用与设计
- 滤波器的使用与设计
- 基于模型设计的FPGA开发与实现:滤波器设计与实现(二)Matlab中滤波器的定点化
- 自适应网页的设计与实现
- 自适应网页的设计与实现
- MDF自适应滤波器实现AEC
- 纹理特征小结
- LibSVM学习详细说明
- CNN在文本分类中的应用
- ubuntu所有php扩展 php-7.0 扩展列表
- mysql 数据分区操作
- 自适应图像降噪滤波器的设计与实现
- 51 Nod 1006 最长公共子序列Lcs
- Python Map()方法的用法
- Android 开发之 Splash 页面 3 秒跳转
- LEADTOOLS Multimedia SDK更新:改进RTSP和H.265/H.264的硬件加速
- 重载操作符与转换
- 【OpenCV入门教程之八】线性邻域滤波专场:方框滤波、均值滤波与高斯滤波
- OSGB 文件格式
- springboot入门