欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

中值滤波的一种快速计算方法

程序员文章站 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

1.图像处理】高效的中值滤波(bug 已修复)

2.中值滤波的快速算法

上一篇: JavaSE回顾笔记Ⅱ

下一篇: