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

📄 medfilt2.m

📁 有关matlab的电子书籍有一定的帮助希望有用
💻 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 + -