%%以下是本人在学习中的个人理解,如有错误请指出
所谓的滤波就是一个系数矩阵(也称为模板,滤波器,滤波模板,核,掩模或者窗口),然后用这个模板对应图像矩阵(填充0后的图像矩阵)进行乘积和运算。
均值滤波就是这个滤波器每个值都是一样大小,每个值是1/k(k为滤波器矩阵的大小),用于去噪
滤波器可通过 w=fspecial(‘type’,parameters)得到,其中type指定滤波器类型,parameters进一步定一规定的滤波器
用fspecial(‘average’)可以创建一个均值滤波器,默认33,每个值都是1/(33)=0.1111
>> h=fspecial('average')
h =
0.1111 0.1111 0.1111
0.1111 0.1111 0.1111
0.1111 0.1111 0.1111
然后创建个简单矩阵
>> x=[1,2,3;4,5,6;2,2,2]
x =
1 2 3
4 5 6
2 2 2
使用filter2(h,x)进行滤波,h为滤波器,x为要滤波的数据,将h放在x上移动进行模板滤波。
y=filter2(h,x)
y =
1.3333 2.3333 1.7778
1.7778 3.0000 2.2222
1.4444 2.3333 1.6667
下面分析过程
填充0后的图像矩阵x:
x =
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 1 2 3 0 0
0 0 4 5 6 0 0
0 0 2 2 2 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
然后进行乘积和运算
x中
0 0 0
0 1 2
4 5 6
分别和h对应的各元素做乘积然后求和:即(1+2+4+5+6)*0.1111=1.3333
所得结果即为滤波后图像y的y(1,1)(对应着x(1,1)),以此类推。
(1+2+4+5+6)*0.1111=(1+2+4+5+6)/9=1.3333
其原理其实就等于用该点的像素值得领域矩阵的均值来代替这点的像素值
即对以该点为中心点的领域矩阵求和 / 领域矩阵大小
下面是均值滤波实现代码:
function [c]=junzhilvbo(j,k)
[m,n]=size(j);
b=zeros(m+2*k,n+2*k);%创建0矩阵
b(k+1:m+k,k+1:n+k)=double(j(:,:));
% 0 0 0(k行0,其他方向也是)
%b= 0 j 0
% 0 0 0
c=zeros(m,n);
for i=k+1:m+k
for j=k+1:n+k
b(i,j)=sum(sum(b(i-k:i+k,j-k:j+k)))/((2*k+1).^2);%b(i,j)这个点为中心点的(2*k+1)^2的大小的矩阵的和*(1/(2*k+1))
end %这里就是均值均值滤波
end
c(:,:)=b(k+1:m+k,k+1:n+k);
%figure,imshow(c,[]);
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值,对去椒盐噪声十分有效。
工具箱提供的函数是
g=medfilt2(f,[m,n],padopt)
[m,n]定义一个大小为mn的领域(在该领域上计算中值),padopt指定三个可能的边界填充选项之一(zeros默认值,symmetric,indexed)
默认形式为
g=medfilt2(f)
使用一个33的领域并用0填充边界来计算中值
下面看例子
f=imread('caise.jpg');
f=rgb2gray(f);
fn=imnoise(f,'salt & pepper',0.2);%用函数imnosie产生椒盐噪声,0.2代表图中白点黑点出现的概率为0.2
figure,imshow(fn);
gm=medfilt2(fn);%中值滤波
figure,imshow(gm);
%%%文章为作者手打,记录和分享自己的学习,如有错误请指出,转载请注明出处