📄 medfilt2.m
字号:
function b = medfilt2(varargin)
%MEDFILT2 Perform 2-D median filtering.
% B = MEDFILT2(A,[M N]) performs median filtering of the matrix
% A in two dimensions. Each output pixel contains the median
% value in the M-by-N neighborhood around the corresponding
% pixel in the input image. MEDFILT2 pads the image with zeros
% on the edges, so the median values for the points within
% [M N]/2 of the edges may appear distorted.
%
% B = MEDFILT2(A) performs median filtering of the matrix A
% using the default 3-by-3 neighborhood.
%
% B = MEDFILT2(A,'indexed',...) processes A as an indexed
% image, padding with zeros if the class of A is uint8, or ones
% if the class of A is double.
%
% Class Support
% -------------
% The input image A can be of class uint8 or double. The output
% image B is of the same class as A.
%
% If the input image A is of class uint8, all of the output
% values are returned as uint8 integers. If the number of
% pixels in the neighborhood (i.e., M*N) is even, some of the
% median values may not be integers. In these cases, the
% fractional parts are discarded.
%
% Example
% -------
% I = imread('eight.tif');
% J = imnoise(I,'salt & pepper',0.02);
% K = medfilt2(J);
% imshow(J), figure, imshow(K)
%
% See also FILTER2, ORDFILT2, WIENER2.
% Copyright 1993-1998 The MathWorks, Inc. All Rights Reserved.
% $Revision: 5.8 $ $Date: 1997/11/24 15:35:55 $
[a, mn, padval] = parse_inputs(varargin{:});
domain = ones(mn);
if (padval == 1)
[ma, na] = size(a);
rowDomainOrigin = ceil(mn(1)/2);
colDomainOrigin = ceil(mn(2)/2);
if (isa(a,'uint8'))
aa = repmat(uint8(1), ma+mn(1)-1, na+mn(2)-1);
aa(rowDomainOrigin:rowDomainOrigin+ma-1, ...
colDomainOrigin:colDomainOrigin+na-1) = a;
a = aa;
else
a = [ones(rowDomainOrigin-1, na+mn(2)-1) ;
ones(ma, colDomainOrigin-1) a ones(ma, mn(2)-colDomainOrigin);
ones(mn(1)-rowDomainOrigin, na+mn(2)-1)];
end
end
if (rem(prod(mn), 2) == 1)
order = (prod(mn)+1)/2;
b = ordfilt2(a, order, domain);
else
order1 = prod(mn)/2;
order2 = order1+1;
if (isa(a,'uint8'))
b = uint8((double(ordfilt2(a, order1, domain)) + ...
double(ordfilt2(a, order2, domain)))/2);
else
b = (ordfilt2(a, order1, domain) + ordfilt2(a, order2, domain))/2;
end
end
if (padval == 1)
b = b(rowDomainOrigin:rowDomainOrigin+ma-1, ...
colDomainOrigin:colDomainOrigin+na-1);
end
if (isa(a,'uint8') & islogical(a))
b = logical(b);
end
%%%
%%% Function parse_inputs
%%%
function [a, mn, padval] = parse_inputs(varargin)
switch nargin
case 0
error('Too few inputs to MEDFILT2');
case 1
% MEDFILT2(A)
a = varargin{1};
mn = [3 3];
padval = 0;
case 2
if (strcmp(varargin{2}, 'indexed'))
% MEDFILT2(A,'indexed')
a = varargin{1};
mn = [3 3];
padval = 1;
else
% MEDFILT2(A,[M N])
a = varargin{1};
mn = varargin{2};
padval = 0;
end
case 3
if (strcmp(varargin{2}, 'indexed'))
% MEDFILT2(A,'indexed',[M N])
a = varargin{1};
mn = varargin{3};
padval = 1;
else
% MEDFILT2(A,[M N],[Mb Nb]) --- grandfathered
a = varargin{1};
mn = varargin{2};
padval = 0;
end
case 4
% MEDFILT2(A,'indexed',[M N],[Mb Nb]) --- grandfathered
a = varargin{1};
mn = varargin{3};
padval = 1;
otherwise
error('Too many inputs to MEDFILT2');
end
if (isa(a,'uint8'))
padval = 0;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -