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

作者: 高正杰 | 来源:发表于2017-12-23 09:45 被阅读1455次

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

相关文章

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

    1. 均值滤波 先创建一个 medfilter.m 文件,代码如下: 创建文件 test_medfilter.m ...

  • 计算摄影学Lab2:图像滤波和傅里叶变换

    任务清单 实现盒装均值滤波 实现高斯滤波 实现中值滤波 实现简单的双边滤波 利用傅里叶变换完成图像的频域变换 空域...

  • 7.6 2D卷积

    OpencV提供了多种滤波方式,来实现平滑图像的效果,例如均值滤波、方框滤波、高斯滤波、中值滤波等,大多数滤波方式...

  • OpenCV For iOS(六)方框、均值、高斯、中值、双边滤

    本节主要记录OpenCV 两类五种常见的滤波方式: 线性滤波:方框滤波、均值滤波、高斯滤波非线性滤波: 中值滤波、...

  • 55. 高斯均值滤波

    本文使用高斯滤波api和均值滤波的源码实现图像滤波 高斯滤波: 结果如下: 均值滤波: 实现步骤: 读取原图片 指...

  • 20180227周二~高通滤波

    提出好问题,也好 空间滤波,分线性和非线性。线性有均值滤波。非线性有中值滤波,最大值滤波,最小值滤波。线性...

  • 009-Opencv笔记-高斯双边模糊-矩阵掩膜

    中值滤波 中值滤波对椒盐噪声有很好的抑制作用 均值模糊无法克服边缘像素信息丢失缺陷。原因是均值滤波是基于平均权重 ...

  • OpenCV-Python学习(九):图像滤波

    目录: 1.滤波的相关概念 2.卷积操作 3.平滑操作(低通滤波)均值滤波中值滤波高斯滤波双边滤波 4.锐化操作(...

  • OpenCV系列七 --- 非线性滤波

    上一篇我们学习了了线性滤波(方框滤波、均值滤波以及高斯滤波),这节呢,我们来学习一下非线性滤波(中值滤波、双边滤波...

  • 图像滤波器选用准则

    我们平时在做图像处理工作的时候经常会听到各种各样的滤波,什么均值滤波、高斯滤波、中值滤波、双边滤波等等,但着眼于应...

网友评论

    本文标题:均值滤波和中值滤波的MATLAB实现

    本文链接:https://www.haomeiwen.com/subject/zmmfgxtx.html