⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmedfilt1.m

📁 是一本教科书的各个章节的源程序代码,适合初学数字图像的人
💻 M
字号:
function Y = wmedfilt1(X, W,BLKSZ)
% 加权一维中值滤波函数
% X表示滤波前的矢量矩阵
% W表示滤波器窗口内元素的加权系数,默认值为[1 1 1]
% Y表示滤波后的矢量矩阵
% 对于边缘点来说,矢量X的左右两边补0 
% 如果N为奇数, Y(k)=Med[ X( k-(N-1)/2 : k+(N-1)/2) ]
% 如果N为偶数, Y(k)=Med[X( k-N/2 : k+N/2-1)]
% 参数BLKSZ 用来解决速度要求和内存供给之间的矛盾。 
% 当内存较小时,设置参数BLKSZ要远小于矢量X的长度 
% 缺省值为BLKSZ == LENGTH(X),当内存足够时可以达到最快的计算速度。 
if nargin < 2
W = [ 1 1 1];
end
%调用wmedfilt1时,如果参数个数小于2,则W值取缺省值[ 1 1 1]

[M,N]=size(W);
%得到滤波窗口宽度

if all(size(X) > 1)   
%如果X为大于一维的矩阵
   nx = size(X,1); 
   if nargin < 3
     BLKSZ = nx;    
   end
%如果wmedfilt1参数个数小于3,则令参数BLKSZ为缺省值-矢量X的长度。

   Y = zeros(size(X));
   for i = 1:size(X,2)
      Y(:,i) =wmedfilt1(Y(:,i),N,BLKSZ);
   end
%重复调用wmedfilt1函数,计算矢量X的中值滤波结果
     return
end

%如果X为一维的矩阵(注意此时的X与我们最先调用的X的关系)
nx = length(X);
if nargin < 3
    BLKSZ = nx;   
end
%确定参数BLKSZ

if rem(N,2)~=1    
    m = N/2;
else
    m = (N-1)/2;
end
% 区分N为偶、奇数

X = [zeros(1,m) X(:)' zeros(1,m)];
%对X的边界补零点。通过改变这一语句我们可以任意改变X边界所补的数值

Y = zeros(1,nx);

indr = (0:N-1)';
indc = 1:nx;
for i=1:BLKSZ:nx
    ind = indc(ones(1,N),i:min(i+BLKSZ-1,nx)) + indr(:,ones(1,min(i+BLKSZ-1,nx)-i+1));
%通过这步操作得到一标号矩阵
xx = reshape(X(ind),N,min(i+BLKSZ-1,nx)-i+1);
%根据wmedfilt1函数参数和标号进行调整
%///////////////////////////////////////
[xm,xn]=size(xx);
E=reshape(xx',1,xm*xn);
c=[];
j=1;
k=1;
for L=1:N
   c=[c
      E(ones(1,W(L)),k:xn*j)];
   j=j+1;
   k=k+xn;
end
%///////////////////////////////////////
%按照加权系数对矩阵进行重组
Y(i:min(i+BLKSZ-1,nx)) = median(xx);
%取中值,根据BLKSZ值得到相应块的加权中值滤波结果

end
% 得到最终加权中值滤波结果

if size(X,2) == 1 
    Y = Y.';
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -