%1通过参数设置该函数可以实现均值滤波,中值滤波,最小值滤波和最大值滤波的功能
%2参数impath为输入的图像路径,
%3参数A为模板矩阵,
A为M*N阶矩阵,M,N均为奇数,且不适宜过大(小于等于11)
%注意:当函数用作统计性的中值、最小、最大值滤波功能时,模板矩阵A的大小(M*N)代表滤波器的大小,但A中元素在图像处理中不再起作用。
%参数para为滤波类型,'ave'
,'min' ,'mid','max',分别代表均值,最小值,中值,最大值滤波功能。
%by paul, Date
2011 3 24
function out = filter(impath,A,para )
if para=='ave'
out=averfilter(impath,A);
else
out=sortfilter(impath,A,para);
end
end
function
output=averfilter(impath,A)
%1.该滤波函数用于对图像进行均值滤波作用,
%即将一个像元及其邻域中的所有像元的平均值赋给输出图像中的相应的像元,以达到平滑的目的。
%2.其中参数impath为图像的路径
%3.参数A为滤波模板,A为一个M*N阶矩阵,注意M,N均为奇数,且不大于11。
%4.参数output为经过均值滤波后的图像矩阵。
%5.该函数采用算法:首先将原始图像矩阵扩充2m行,2n列,并将扩充位补0,
%然后再将原图形矩阵的每一个像素点按照output(i,j)=sum(sum(mask.*A))/(m*n)得到。
%by paul
Date 3.19.2011
input=imread(impath);%将原始图像转化为矩阵存于input中。
[row,col]=size(input);%返回矩阵的行和列。
[m,n]=size(A);%返回模板的行和列分别存于m,n中。
edgeLength=floor(m/2);%模板的半长
edgeWidth=floor(n/2);%模板的半高
image=zeros(row+2*edgeLength,col+2*edgeWidth);%将矩阵扩充2edgeLength行,2edgewidth列,填充元素为0,并存于image中
for
i=1:1:row
for j=1:1:col
image(i+edgeLength,j+edgeWidth)=input(i,j);
end
end
output=input;%将output输出矩阵初始化
%下面的循环用于完成将扩充矩阵image做均值滤波过程,并将对应元素输出到output矩阵中。
for
i=1+edgeLength:1:row-edgeLength
for j=1+edgeWidth:1:col-edgeWidth
mask=image(i-edgeLength:i+edgeLength,j-edgeWidth:j+edgeWidth);%在扩充的矩阵中以image(i,k)为中心取与模块A大小相同的矩阵
numlmatrix=mask.*A;%矩阵的对应元素相乘,
output(i-edgeLength,j-edgeWidth)=sum(sum(numlmatrix))/(m*n);%将对应元素输出到output矩阵的相应位中。
end
end
imshow(output);%将滤波后的函数显示成图像。
end
%该函数的作用是统计非线性的排序滤波,包括中值滤波,最小值滤波,最大值滤波。
%参数impath为图像的路径
%A为模块儿矩阵,此时,只与此矩阵的大小有关,与元素无关。
%para参数用于选择排序滤波的方式,最小,中间,最大的三个英文首字母分别表示最小滤波,中值滤波,最大滤波。
function output = sortfilter(impath,A,para )
input=imread(impath);
[row,col]=size(input);%返回矩阵的行和列。
[m,n]=size(A);%返回模板的行和列分别存于m,n中。
edgeLength=floor(m/2);%模板的半长
edgeWidth=floor(n/2);%模板的半高
image=zeros(row+2*edgeLength,col+2*edgeWidth);%将矩阵扩充2edgeLength行,2edgewidth列,填充元素为0,并存于image中
for
i=1:1:row
for j=1:1:col
image(i+edgeLength,j+edgeWidth)=input(i,j);
end
end
output=input;%将output输出矩阵初始化
%最小值滤波
for
i=1+edgeLength:1:row-edgeLength
for j=1+edgeWidth:1:col-edgeWidth
mask=image(i-edgeLength:i+edgeLength,j-edgeWidth:j+edgeWidth);%在扩充的矩阵中以image(i,k)为中心取与模块A大小相同的矩阵
vertex=Matrix2Vertex(mask);%将矩阵转换成行向量
[vertex2,sortindex]=sort(vertex);%对行向量进行排序,返回到vertex2矩阵中。
if
para=='min' output(i-edgeLength,j-edgeWidth)=vertex2(1);%将对应元素最小值输出到output矩阵的相应位中。
elseif para=='mid'
output(i-edgeLength,j-edgeWidth)=vertex2(floor(m*n/2)+1);%将对应元素中间值输出到output矩阵的相应位中。
elseif para=='max'
output(i-edgeLength,j-edgeWidth)=vertex2(m*n);%将对应元素最大值输出到output矩阵的相应位中。
else break;
end
end
end
if
(para=='min')|(para=='max')|(para=='mid')
imshow(output);
else fprintf('You have input a
wrong parameter,Please input again!!!n');
end
end
%
将矩阵转换为向量
function vertex =
Matrix2Vertex(matrix)
[row, col] =
size(matrix);
vertex =
zeros(row * col, 1);
for i = 1 :
row * col
vertex(i) = matrix(i);
end
end