中值滤波的一种快速计算方法
程序员文章站
2024-03-25 22:02:52
...
中值滤波(median filter)为常用图像滤波算法,用于处理椒盐噪声且能够保持边界,由于是非线性操作,传统的做法即对局部区域进行排序取中值的方法,较为耗时。
一种快速的计算法,即使用直方图取中位数代替排序,且利用相邻元素的直方图变动较少更新直方图,这样迭代获得滤波结果, 如下:
Matlab源码如下:
clc;
clear all;
close all;
image=imread('lena.jpg');
image=rgb2gray(image);
image=double(image);
[ih,iw]=size(image);
%中值滤波器尺寸
fw=5;
fh=5;
hfw=floor(fw/2);
hfh=floor(fh/2);
%1.image pad,边界拓展
src=zeros(ih+fh-1,iw+fw-1);
for i=1-hfh:1:ih+hfh
row=i;
if(i<1)
row=1;
elseif(i>ih)
row=ih;
end
for j=1-hfw:1:iw+hfw
col=j;
if(j<1)
col=1;
elseif(j>iw)
col=iw;
end
src(i+hfh,j+hfw)=image(row,col);
end
end
%2.滤波操作
th=(fw*fh)/2+1;%中值位置
dst=zeros(ih,iw);%输出
for row=1:ih
%2.1当前行先初始化直方图
imHist=zeros(256,1);
num=0;
for i=row:fh+row-1
for j=1:fw
imHist(src(i,j)+1)=imHist(src(i,j)+1)+1;%图像取值范围0~255
end
end
for i=0:255
num=imHist(i+1)+num;
if(num>th)
index=i;
break;
end
end
%2.2当前行第1个元素赋值
dst(row,1)=index;
%2.3当前行其他元素计算
for col=2:iw
%2.3.1更新直方图
for i=row:fh+row-1
imHist(src(i,col-1)+1)=imHist(src(i,col-1)+1)-1;%待输出统计元素
imHist(src(i,fw+col-1)+1)=imHist(src(i,fw+col-1)+1)+1;%待增加统计的元素
if(src(i,col-1)<=index)
num=num-1;
end
if(src(i,fw+col-1)<=index)
num=num+1;
end
end
%2.3.2寻找中值滤波结果
while(num>th)
num=num-imHist(index+1);
index=index-1;
end
while(num<th)
index=index+1;
num=num+imHist(index+1);
end
dst(row,col)=index;
end
end
figure,imshow(image,[]),title('src image');
figure,imshow(src,[]),title('pad image');
figure,imshow(dst,[]),title('filter image');
Reference
上一篇: JavaSE回顾笔记Ⅱ