function b = all_medfilt2(varargin)
%function b = all_medfilt2(A, ORDER, MN, PADOPT)
% 函数all_medfilt2可实现多种二维中值滤波函数
% A表示输入二维数据
% B表示最终滤波结果,与A同型
% ORDER为排序参数
% ORDER=1 为极小滤波器, …
% …..
% ORDER=(M*N) 为极大滤波器
% ORDER的默认值为0, 此时特指二维中值滤波
% [M N]表示滤波器窗口,默认值为[3 3]
% PADOPT 表示原始数据A的边缘补值
% 默认值为 'zeros', 即补值为0;
% 为'symmetric', 则对称补值
% 为'indexed', 如果A是double型, 补值为1, 否则补0
% 当M*N为偶数且A为uint8型时, 如果中值为小数,则舍掉分数部分
[a, order, mn, padopt] = parse_inputs(varargin{:});
% 利用子函数确定其中的四个参数
domain = ones(mn);
% 确定滤波窗
if order==0
% 如果为中值滤波
if (rem(prod(mn), 2) == 1)
% 如果M*N为奇数
order = (prod(mn)+1)/2;
b = ordfilt2(a, order, domain, padopt);
else
% 如果M*N为偶数
order1 = prod(mn)/2;
order2 = order1+1;
b = ordfilt2(a, order1, domain, padopt);
b2 = ordfilt2(a, order2, domain, padopt);
idx = find(b ~= b2);
b(idx) = (double(b(idx)) + double(b2(idx)))/2;
% 相加取均值
end
else
% 如果不是中值滤波
b = ordfilt2(a, order, domain, padopt);
end
if (isa(a,'uint8') & islogical(a))
% 如果a为uint8型且a为实数时
b = logical(b);
end
%%%
%%%子函数 parse_inputs
%%%
function [a, order, mn, padopt] = parse_inputs(varargin)
if (nargin < 1)
error('Too few inputs.');
end
if (nargout >4)
error('Too many outputs.');
end
% 如果有字符参数, 首先进行判定
% 然后从参数中删掉
%
a = varargin{1};
% 找到第一个参数
charLocation = [];
for k = 2:nargin
if (ischar(varargin{k}))
charLocation = [charLocation k];
end
end
if (length(charLocation) > 1)
error('Invalid input.');
elseif (length(charLocation) == 0)
padopt = 'zeros';
else
options = {'indexed', 'zeros', 'symmetric'};
idx = strmatch(lower(varargin{charLocation}), options);
if (length(idx) == 0)
error('Unknown option.');
elseif (length(idx) > 1)
error('Ambiguous option.');
else
padopt = options{idx};
end
varargin(charLocation) = [];
end
if (strcmp(padopt, 'indexed'))
if (isa(a,'double'))
padopt = 'ones';
else
padopt = 'zeros';
end
end
if (length(varargin) > 1)
order = varargin{2};
else
order =0;
end
if (length(varargin) > 2)
mn = varargin{3};
else
mn = [3 3];
end
% 获得滤波窗口
order=min(prod(mn),order)
% 限定order 最大值