中值滤波——MATLAB实现
1、原理
中值滤波能有效抑制噪声。主要采用灰度值排序,把数字图像中一点的值用该点的一个邻域中各点值的中值代替,依次取代像素中心点的灰度值,让原本与周围像素灰度值相差比较大的像素更改为与周围的像素值比较接近的值,从而消除孤立的噪声点。它可以保护图像边缘的同时去除噪声。
- 实现代码 clear all; clc; %图像进行中值滤波,并显示图像 %读进图像 [filename, pathname] = uigetfile({*.jpg; *.bmp; *.gif}, 选择原图片); %没有图像 if filename == 0 return; end picture = imread([pathname, filename]); [m, n, z] = size(picture); %转换为灰度图 if z>1 picture = rgb2gray(picture); end %给图像加高斯噪声 J=imnoise(picture,gaussian,0,0.01); %给图像加椒盐噪声 H = imnoise(picture,salt & pepper,0.02); %调用 median_filter( ) 进行处理 result = median_filter(picture, 3); % 显示处理后的结果 figure(1) subplot(1,4,1); imshow(picture); title(原图片); subplot(1,4,2); imshow(J); title(高斯噪声后的图片); subplot(1,4,3); imshow(H); title(椒盐噪声后的图片); subplot(1,4,4); imshow(result); title(中值滤波后); //代码保存为 median_filter.m
- function [ img ] = median_filter( picture, m )
- %中值滤波
- %输入:picture:原图,m:模板的大小3*3的模板,此时m=3
- %输出:img:中值滤波处理后的图像
- n = m;
- [ height, width ] = size(picture);
- x1 = double(picture);% 将图象中的数据类型从uint8转换存储为double型
- x2 = x1;
- for i = 1: height-n+1
- for j = 1:width-n+1
- mb = x1( i:(i+n-1), j:(j+n-1) );%取出模板元素
- mb = mb(:);%矩阵的元素以一列输出
- mm = median(mb);%取向量中值
- x2( i+(n-1)/2, j+(n-1)/2 ) = mm;%对中心元素赋值
- end
- end
- img = uint8(x2);% 将图象中的数据类型从double型转换存储为unit8型
- end 3、实验结果