matlab统计像元百分,[转载]均值 统计滤波器程序 matlab

%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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值