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日搬家至此!