均值滤波和中值滤波的MATLAB实现

1. 均值滤波

先创建一个 medfilter.m 文件,代码如下:

function [output] = meansfilter(input, radius)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% input: 噪声图像
% r: 图像块半径
%
% Auther: Gao Zheng jie
% Email: 3170601003@cuit.edu.cn
% Date: 2017-12-19
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[m n] = size(input);  % 获取图像的行列维度,并分别赋给m和n
Output = zeros(m, n);  % 定义m*n的零矩阵,用来存放去噪结果图像
input_pad = padarray(input, [radius radius], 'symmetric');  %边界延拓,使得位于图像边缘的像素点也能形成图像块。
                                                  % symmetric 对边界区域进行对称性重复(也叫镜像镶边),拓展的大小为[r r],f为图像块半径
                                                  %例如[2 3]表示垂直方向拓展2行,水平方向拓展3列
% 逐行、依次对图像中的每个像素点进行局部均值去噪处理
for i=1:m  % 行
    for j=1:n  % 列
        % 在延拓后的图像中确定将要修补点的坐标
        x = i + radius;
        y = j + radius;
        % 确定当前像素点的邻域(或者说当前点所在的图像块)
        neighbordhood = input_pad(x-radius:x+radius, y-radius:y+radius);
        output(i,j) = median(neighbordhood(:));  % 先将整个图像块扁平化,然后取中值
    end
end

创建文件 test_medfilter.m 代码如下:

clc; %清除命令窗口的内容
clf; %清除图形
clear; %清除原有变量
colormap(gray); %设置色图,色图是一个m*3的矩阵,每一个位置的取值是0或1

img = imread('einstein.jpg');
input = imnoise(img, 'salt & pepper');  % 添加椒盐噪声,默认噪声密度0.05(噪声密度是指包含噪声值的图像区域的百分比)
output = medfilter(input, 1);  % 半径为1,即取3*3的图像块
output = uint8(output);

%figure %创建新的图形窗口
%colormap(gray) %设置色图,色图是一个m*3的矩阵,每一个位置的取值是0或1
clf %清除图形
subplot(2,3,1),imagesc(img),xlabel('img'); % 原图
subplot(2,3,2),imagesc(input),xlabel('input'); % 加了噪声的图像
subplot(2,3,3),imagesc(input-img),xlabel('real noise'); % 计算并显示所加的噪声
subplot(2,3,4),imagesc(output),xlabel('output'); % 处理后的图像
subplot(2,3,5),imagesc(input-output),xlabel('residuals noise'); % 计算并显示噪声冗余图像,对去噪结果进行定性比较

<font color=”red” face=”幼圆” size=”4″>将这两个文件放在同一个文件夹下,然后在 matlab 中运行 test_medfilter.m 即可。</font>

2. 中值滤波

先创建一个 meansfilter.m 文件,代码如下:

function [output] = meansfilter(input, radius)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% input: 噪声图像
% r: 图像块半径
%
% Auther: Gao Zheng jie
% Email: 3170601003@cuit.edu.cn
% Date: 2017-12-19
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[m n] = size(input);  % 获取图像的行列维度,并分别赋给m和n
Output = zeros(m, n);  % 定义m*n的零矩阵,用来存放去噪结果图像
input_pad = padarray(input, [radius radius], 'symmetric');  %边界延拓,使得位于图像边缘的像素点也能形成图像块。
                                                  % symmetric 对边界区域进行对称性重复(也叫镜像镶边),拓展的大小为[r r],f为图像块半径
                                                  %例如[2 3]表示垂直方向拓展2行,水平方向拓展3列
weight = (2*radius+1)^2;  % 算术均值滤波中每一个像素点的权重
% 逐行、依次对图像中的每个像素点进行局部均值去噪处理
for i=1:m  % 行
    for j=1:n  % 列
        % 在延拓后的图像中确定将要修补点的坐标
        x = i + radius;
        y = j + radius;
        % 确定当前像素点的邻域(或者说当前点所在的图像块)
        neighbordhood = input_pad(x-radius:x+radius, y-radius:y+radius);
        output(i,j) = sum(sum(neighbordhood))/weight;
    end
end

创建文件 test_medfilter.m 代码如下:

clc; %清除命令窗口的内容
clf; %清除图形
clear; %清除原有变量
colormap(gray); %设置色图,色图是一个m*3的矩阵,每一个位置的取值是0或1

img = imread('einstein.jpg');
input = imnoise(img, 'gaussian');  % 添加高斯噪声,默认均值为0,方差为0.01
output = meansfilter(input, 1);  % 半径为1,即取3*3的图像块
output = uint8(output);

%figure %创建新的图形窗口
%colormap(gray) %设置色图,色图是一个m*3的矩阵,每一个位置的取值是0或1
clf %清除图形
subplot(2,3,1),imagesc(img),xlabel('img'); % 原图
subplot(2,3,2),imagesc(input),xlabel('input'); % 加了噪声的图像
subplot(2,3,3),imagesc(input-img),xlabel('real noise'); % 计算并显示所加的噪声
subplot(2,3,4),imagesc(output),xlabel('output'); % 处理后的图像
subplot(2,3,5),imagesc(input-output),xlabel('residuals noise'); % 计算并显示噪声冗余图像,对去噪结果进行定性比较

将这两个文件放在同一个文件夹下,然后在 matlab 中运行 test_medfilter.m 即可。


该文章于2017年12月19日于CSDN上首次发表,2017年12月23日搬家至此!

    原文作者:高正杰
    原文地址: https://www.jianshu.com/p/64420723729f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞