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

📄 all_medfilt2.m

📁 是一本教科书的各个章节的源程序代码,适合初学数字图像的人
💻 M
字号:
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 最大值

⌨️ 快捷键说明

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