空域滤波-中值滤波

任务

在进行均值滤波后,相类的对空域的操作是中值滤波。即百分比滤波的一种特例,使中心点像素值为模板覆盖所有像素值排列后某特定位的值。

百分比滤波

代码

%% 空域平滑滤波-中值
% Function:将灰度图grayImg按照固定3*3模板百分比(可选中值)滤波
% ratio:指定百分比值:0~1;默认中值0.5
% Date:2020/10/8
% Author:leezeeyee
function meanImg=spaceG2(grayImg,ratio)
%  输入容错
if nargin<2
    ratio=0.5;
end
% 边缘保留
meanImg=uint16(grayImg);
[M,N]=size(grayImg);
meanImg(2:M-1,2:N-1)=0;
% 计算选取的像素点
% 模板大小(像素个数)
sumModule=9;
index=uint8(1+(sumModule-1)*ratio);
% 进行中值滤波
for row=2:M-1
    for col=2:N-1
        % 卷积核/模板;
        module=grayImg(row-1:row+1,col-1:col+1);
        % 遍历过程,将中心值用排序后的像素值取代
        % 寻找矩阵中排序为index的像素值
        sorted=sort(reshape(module,[sumModule,1]));
        replace=sorted(index);
        meanImg(row,col)=replace;
    end
end
meanImg=uint8(meanImg);
end

实现效果

与均值滤波对比

与均值滤波相比,去噪效果较好,且清晰度较高。

不同百分比对照

figure('name','不同百分比');
subplot(2,6,1)
imshow(grayImg);
title('灰度图');
noiseImg=pepperNoise(grayImg);
subplot(2,6,2)
imshow(noiseImg);
title('加椒盐噪声后');
for plot=1:10
    meanImg=spaceG2(noiseImg,0.1*plot);
    subplot(2,6,plot+2)
    imshow(meanImg);
    title(['0.',num2str(plot),'百分比滤波后']);
end

可见,在百分比选取在0.2~0.5之间时,去噪效果较好,当百分比升高,选取的像素值趋近噪点,使图像出现大片雪花。

修改模板大小

代码

%% 空域平滑滤波中值
% Function:将灰度图grayImg与模板卷积
% n: 卷积核大小,默认为3x3。范围>=3,且为奇数,偶数则进行2*n+1处理
% ratio:指定百分比值,0~100(%)默认50(%)
% Date:2020/10/8
% Author:leezeeyee
function meanImg=spaceG2np(grayImg,n,ratio)
if nargin<2
    n=3;
    ratio=0.5;
else nargin<3
    ratio=0.5;
end
% 输入有误处理
if mod(n,2)==0 || n==1
    n=n*2+1;
    print('n 为>=3的奇数,取n=n*2+1');
end
% 边缘保留值
keep=(n-1)/2;
% 边缘保留,预先*n^2
[M,N]=size(grayImg);
% 拓展原灰度图
processImg=-1*ones(M+n-1,N+n-1);
processImg(keep+1:M+keep,keep+1:N+keep)=grayImg;
meanImg=uint16(size(grayImg));
for row=1:M
    for col=1:N
%         通过对0的计算,得知此像素点周围的有效像素点个数(非-1)
        convM=processImg(row:row+2*keep,col:col+2*keep);
        % 卷积核/模板
        module=convM(convM~=(-1));
        % 计算选取的像素点
        % 模板大小(像素个数)
        [sumModule,~]=size(module);
        index=uint8(1+(sumModule-1)*ratio);
        % 遍历过程,将中心值用排序后的像素值取代
        % 寻找矩阵中排序为index的像素值
        sorted=sort(reshape(module,[sumModule,1]));
        replace=sorted(index);
        meanImg(row,col)=replace;
    end
end
meanImg=uint8(meanImg);
end

实现效果

百分比选取固定值不变(中值0.5),随着模板的增大,图像的噪点趋于平滑。但模板更大时,整幅图像模糊化。

Leave a comment

Your email address will not be published. Required fields are marked *