200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > matlab调和均值滤波_均值滤波和中值滤波的MATLAB实现

matlab调和均值滤波_均值滤波和中值滤波的MATLAB实现

时间:2019-09-14 18:31:57

相关推荐

matlab调和均值滤波_均值滤波和中值滤波的MATLAB实现

1. 均值滤波

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

function [output] = meansfilter(input, radius)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% input: 噪声图像

% r: 图像块半径

%

% Auther: Gao Zheng jie

% Email: 3170601003@

% Date: -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'); % 计算并显示噪声冗余图像,对去噪结果进行定性比较

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

2. 中值滤波

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

function [output] = meansfilter(input, radius)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% input: 噪声图像

% r: 图像块半径

%

% Auther: Gao Zheng jie

% Email: 3170601003@

% Date: -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 即可。

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。