# 数字图像处理，自适应中值滤波的C++实现

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

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

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

2）若 fmin< fij <fmax，则输出fij；否则输出fmed

/////////////自适应中值滤波/////////////////////////////////
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都不是噪声优先输出当前窗口中心值
else
outbuffer[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;
}

# 实验结果：

1，对原图像进行处理的结果（左为原图）

2，对乘性噪声图像进行处理的结果（左为噪声图）

3，对椒盐噪声图像进行处理的结果（左为噪声图）

function f = adpmedian(g, Smax)
%   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;

% Begin filtering.
for k = 3:2:Smax
zmin = 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) & ...
zB = (g > zmin) & (zmax > g);
outputZxy  = processUsingLevelB & zB;
outputZmed = processUsingLevelB & ~zB;
f(outputZxy) = g(outputZxy);
f(outputZmed) = zmed(outputZmed);

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++实现

• EbowTang
• 2014年07月26日 15:41
• 3308

## 【Matlab学习笔记】【图像滤波去噪】中值滤波

• u013035197
• 2015年05月13日 09:01
• 3970

## 利用fft2计算二维卷积 (Matlab常用图像操作)

3 利用fft2计算二维卷积    利用fft2函数可以计算二维卷积,如:    a=[8,1,6;3,5,7;4,9,2];    b=[1,1,1;1,1,1;1,1,1];    a(8,8)=...
• cwqcgx
• 2011年03月31日 14:11
• 16056

## matlab中值滤波--medfilt2

x=imread(‘x.jpg’); x=rbg2gray(x);  %转成灰度图像 k=medfilt2(x);   %中值滤波，默认为3X3矩阵 figure, imshow(k)...
• 2011年05月20日 10:13
• 20100

## 中值滤波与椒盐噪声

• zbc1090549839
• 2014年08月06日 18:54
• 11898

## MATLAB图像平滑与滤波实验

• DaveBobo
• 2016年05月29日 22:15
• 3874

## 自适应中值滤波 MATLAB

• 2010年04月26日 23:59
• 843B
• 下载

## 自适应中值滤波及MATLAB实现

• yi_tech_blog
• 2016年12月29日 22:45
• 6284

## 自适应中值滤波

• u012428169
• 2016年11月25日 10:09
• 2435

## 自适应中值滤波RAMF

• qq_20823641
• 2016年06月26日 21:26
• 3454

举报原因： 您举报文章：数字图像处理，自适应中值滤波的C++实现 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)