自适应中值滤波的原理

自适应中值滤波的思想是根据噪声密度改变滤波窗口的大小,同时对噪声点和信号点采取不同的处理方法。对噪声点进行中值滤波,对信号点保持其灰度值不变。

设为fij为点(i,j)的灰度值,Sij为当前工作窗口,fmin,fmax和fmed分别为Sij中的灰度最小值、灰度最大值和灰度中值,令maxize为预设的允许最大窗口。自适应中值滤波的步骤如下:

1)若 fmin< fmed <fmax,则转至第2步;否则增大窗口的尺寸。若的尺寸小于的尺寸,则重复第1步;否则输出。

2)若 fmin< fij <fmax,则输出fij;否则输出fmed。

可以看出,算法中噪声的检测和认定时以 fmin和 fmax为基准的,如果 fmin< fmed <fmax,表明fmed 不是噪声,

接着根据fmin< fij <fmax,判断fij 是否为噪声,当fmed与fij 都不是脉冲噪声时,优先输出fij。

引入自适应中值滤波算法主要有3 个目的:

一是去除脉冲噪声;

二是平滑其他非脉冲噪声;

三是减少诸如物体边界细化或粗化等失真。

自适应中值滤波的流程图如下图所示。

参考代码:

/自适应中值滤波/
int adp_media_filter(unsigned char* inbuffer,int width,int height,int maxwinsize,unsigned char* outbuffer)
{int pos = (maxwinsize - 1) / 2;memcpy(outbuffer,inbuffer,width*height);       for (int m = pos; m < height - pos; m++)//当前中心位置(m,n){for (int n = pos; n < width - pos; n++){int curwinsize = 3;     //设置初始滤波窗口大小while (curwinsize <= maxwinsize){int curpos = (curwinsize - 1) / 2;int winpos = 0;int lens = curwinsize*curwinsize;int* windows = new int[lens];for (int i = -curpos; i < curpos + 1; i++)for (int j = -curpos; j < curpos + 1; j++)windows[winpos++] = inbuffer[(m + i)*width + n + j];sort(windows, lens);int fmin = windows[0];int fmax = windows[lens - 1];int fmed = windows[(lens - 1) / 2];int A1 = fmed - fmin;int A2 = fmed - fmax;if (A1 > 0 && A2 < 0)//第一层噪声检测,fmed是不是噪声{//满足fmin< fmed < fmax,表明fmed不是噪声int B1 = inbuffer[m*width + n] - fmin;//当前窗口中心值inbuffer[m*width + n]int B2 = inbuffer[m*width + n] - fmax;//满足fmin< fmn < fmax,表明fmn不是噪声if (B1 > 0 && B2 < 0)//第二层检测,fmn是不是噪声outbuffer[m*width + n] = inbuffer[m*width + n];//fmn和fmed都不是噪声优先输出当前窗口中心值elseoutbuffer[m*width + n] = fmed;//fmn是噪声,输出中间值重新估计该点delete[] windows;windows = NULL;break;}curwinsize += 2;delete[] windows;windows = NULL;}}}//对边界进行处理,与中值滤波一样for (int k = 0;k < pos;k++)for (int l =pos;l < width-pos;l++)outbuffer[k*width+l] = outbuffer[pos*width+l];for(int a=height-pos;a < height;a++)for(int b=pos;b < width-pos;b++)outbuffer[a*width+b] = outbuffer[(height-pos-1)*width+b];for(int c = 0;c < pos;c++)for(int d=0;d < height;d++)outbuffer[d*width+c] = outbuffer[d*width+pos];for (int e = width-pos;e < width;e++)for(int f = 0;f < height;f++)outbuffer[f*width+e] = outbuffer[f*width+width-pos-1];return 0;
}

实验结果:

以下所有结果均为C++处理。
1,对原图像进行处理的结果(左为原图)
可以发现,自适应中值滤波对图像边缘的保护相当好

2,对乘性噪声图像进行处理的结果(左为噪声图)

注意该噪声为matlab中的乘性噪声,可以发现对乘性噪声的处理效果相当差。

3,对椒盐噪声图像进行处理的结果(左为噪声图)

注意该噪声为matlab中的椒盐噪声,可以发现对椒盐噪声的处理效果优秀。

最后在此处收录一份别人写的matlab程序:

function f = adpmedian(g, Smax)
%ADPMEDIAN Perform adaptive median filtering.
%   F = ADPMEDIAN(G, SMAX) performs adaptive median filtering of
%   image G.  The median filter starts at size 3-by-3 and iterates up
%   to size SMAX-by-SMAX. SMAX must be an odd integer greater than 1.%   Copyright 2002-2004 R. C. Gonzalez, R. E. Woods, & S. L. Eddins
%   Digital Image Processing Using MATLAB, Prentice-Hall, 2004
%   $Revision: 1.5 $  $Date: 2003/11/21 14:19:05 $% SMAX must be an odd, positive integer greater than 1.
if (Smax <= 1) | (Smax/2 == round(Smax/2)) | (Smax ~= round(Smax))error('SMAX must be an odd integer > 1.')
end
[M, N] = size(g);% Initial setup.
f = g;
f(:) = 0;
alreadyProcessed = false(size(g));% Begin filtering.
for k = 3:2:Smaxzmin = ordfilt2(g, 1, ones(k, k), 'symmetric');zmax = ordfilt2(g, k * k, ones(k, k), 'symmetric');zmed = medfilt2(g, [k k], 'symmetric');processUsingLevelB = (zmed > zmin) & (zmax > zmed) & ...~alreadyProcessed; zB = (g > zmin) & (zmax > g);outputZxy  = processUsingLevelB & zB;outputZmed = processUsingLevelB & ~zB;f(outputZxy) = g(outputZxy);f(outputZmed) = zmed(outputZmed);alreadyProcessed = alreadyProcessed | processUsingLevelB;if all(alreadyProcessed(:))break;end
end% Output zmed for any remaining unprocessed pixels. Note that this
% zmed was computed using a window of size Smax-by-Smax, which is
% the final value of k in the loop.
f(~alreadyProcessed) = zmed(~alreadyProcessed);

参考资源:

【1】自适应中值滤波算法在图像处理中的应用,刘 颖,陈谨女,长安大学电子与控制工程工程学院
【2】一种改进的自适应中值滤波方法,卫保国,西北工业大学电子信息学院,2008

数字图像处理,自适应中值滤波的C++实现相关推荐

  1. 图像处理-自适应中值滤波

    原文链接:https://blog.csdn.net/qq_35608277/article/details/78498044 提出原因: 常规的中值滤波器,在噪声的密度不是很大的情况下(根据经验,噪 ...

  2. matlab中基于十字形窗口的滤波算法,#215;字形滤波窗口在Matlab自适应中值滤波算法中的应用 - 21ic中国电子网...

    由于种种原因,图像在生成.传输.变换等过程中往往会受到各种噪声的污染,从而导致图像质量退化.噪声信号的滤波是图像处理的基本任务之一,主要有线性滤波和非线性滤波两种方法.线性滤波方法一般具有低通特性,而 ...

  3. 【图像去噪】基于matlab自适应中值滤波图像去噪【含Matlab 1156期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像去噪]基于matlab自适应中值滤波图像去噪[含Matlab 1156期] (https://download.csdn.net/d ...

  4. matlab设计自适应中值滤波,matlab课程设计(自适应中值滤波).doc

    matlab课程设计(自适应中值滤波).doc 10信息工程系课程设计报告课程MATLAB课程设计专业通信工程班级2级本科二班学生姓名1景学号114学生姓名2学号1414学生姓名3王学号6学生姓名4学 ...

  5. matlab练习程序(自适应中值滤波RAMF)

    中值滤波是很经典的算法了.今天看论文又知道还有一种叫自适应中值滤波的算法RAMF.原论文在这里. RAMF主要通过以下两步来处理图像. 1.首先确定最大的滤波半径,然后用一个合适的半径r对图像进行滤波 ...

  6. 自适应中值滤波及实现

    前言 无意中看到了一篇比较老的论文,Adaptive median filters: new algorithms and results.感兴趣的可以下载下来看看.主要就是提出了一种自适应中值滤波算 ...

  7. 自适应中值滤波用于超声图像降噪

    自适应中值滤波原理: RAMF主要通过以下两步来处理图像. 1.首先确定最大的滤波半径,然后用一个合适的半径r对图像进行滤波.计算当前滤波半径像素灰度的Imin,Imax,Imed,然后判断Imed是 ...

  8. C++自定义自适应中值滤波

    Mat autoMedFilter(Mat img, int filter_size,int max_filter_size) {//滤波器尺寸必须是奇数if ((filter_size % 2) ! ...

  9. matlab编程实现自适应均值滤波和自适应中值滤波

    matlab编程实现自适应滤波器 一.自适应均值滤波器 1. 原理部分: 2. 程序代码 3. 结果对比 二.自适应中值滤波 1. 原理部分 2.程序代码 3. 结果对比 一.自适应均值滤波器 1. ...

最新文章

  1. Nat.Commun.|使用基于注意力机制的多标签神经网络预测并解释12种RNA修饰
  2. keras和tensorflow 报错解决:UserWarning: Method on_batch_end() is slow compared to the batch update Check
  3. SAP Fiori Elements list report filter - implemented by framework
  4. RHEL6.0使用centos的YUM更新源
  5. python创建数据库表空间_7.自动化监控多个Oracle表空间
  6. Chrome浏览器兼容性 检测工具 (chrome插件)
  7. 8.用MyEclipse进行JSP开发
  8. php中的数组用什么统计,php数组元素统计与值汇总
  9. flask中数据库迁移
  10. Traditional industries like notebook computers seem
  11. python遇到‘\u’开头的unicode编码
  12. 全球四大互联网公司最大的敌人是谁
  13. Android:应用宝省流量更新
  14. 用计算机怎么按四分之三次方等于多少,八十一分之十六的负四分之三次方怎么算,要具体过程,答案是多少?...
  15. 大陆身份证号码格式校验代码
  16. Photoshop CS6详细安装图文教程
  17. 基于MapGIS的GIS二次开发作业文档
  18. Java连接Sql Server的过程及遇到的问题(极端新手向)
  19. tkinter窗口美化功能介绍 第一章 内部美化功能
  20. Docker下安装MCR windows镜像安装Matlab 静默安装MCR silent install 无交互安装 无Gui安装 控制台安装

热门文章

  1. python | 尝试爬虫 xpath
  2. 难道是C3p0的问题
  3. EF和Dapper之争的关键
  4. 《魔兽世界》营收出现大幅下滑
  5. 为什么apt-get update 要与apt-get install 在一起
  6. MIT一牛人对数学在机器学习中的作用给的评述
  7. Android程序员面试必须要掌握的:Https加密原理、中间人攻击到底是怎么回事
  8. 编译项目时pangolin出现莫名其妙的问题
  9. 生物信息百Jia软件(六):prodigal
  10. 2008北京奥运会足球赛程(男足)