Code covered by the BSD License  

Highlights from
Standard deviation filter

image thumbnail

Standard deviation filter

by

Jan Motl (view profile)

 

Standard deviation filter for images based on integral images.

stdfilter(image, varargin)
function deviation = stdfilter(image, varargin)
%STDFILTER 2-D standard deviation filtering.
%   B = STDFILTER(A) performs standard deviation filtering of two dimensional 
%   matrix A with integral image method. Each output pixel contains 
%   the standard deviation value of the 3-by-3 neighborhood around the corresponding
%   pixel in the input image.  
%
%   B = STDFILTER(A, [M N]) filters matrix A with M-by-N neighborhood.
%   M defines vertical window size and N defines horizontal window size. 
%
%   B = STDFILTER(A, [M N], CORRECTION) boolean value CORRECTION decides
%   whether to use corrected variance estimate (the degree of freedom is
%   decremented by one) or uncorected estimate (the degree of freedom is
%   equal to the sample size). 
%   The default setting is set to FALSE (use uncorrected estimate). 
%   
%   B = STDFILTER(A, [M N], CORRECTION, PADDING) filters matrix A with the 
%   predefinned padding. By default the matrix is padded with zeros to 
%   be compatible with STDFILT. But then the borders may appear distorted.
%   To deal with border distortion the PADDING parameter can be either
%   set to a scalar or a string: 
%       'circular'    Pads with circular repetition of elements.
%       'replicate'   Repeats border elements of matrix A.
%       'symmetric'   Pads array with mirror reflections of itself. 
%
%   Comparison
%   ----------
%   There are different ways how to perform standard deviation filtering in MATLAB. 
%   An effective way for small neighborhoods is to use STDFILT:
%
%       I = imread('eight.tif');
%       J = stdfilt(I);
%       figure, imshow(I), figure, imshow(J)
%
%   However, STDFILT slows down with the increasing size of the 
%   neighborhood while STDFILTER processing time remains constant.
%   And once one of the neighborhood dimensions is over 23 pixels,
%   STDFILT is faster. Anyway, both STDFILT and STDFILTER give
%   the same results.
%
%   Remark
%   -------
%   The output class type is the same as the class type of input matrix A.
%
%   Example
%   -------
%       I = imread('eight.tif');
%       J = stdfilter(I, [5 5], true, 'replicate');
%       figure, imshow(I), figure, imshow(J)
%
%   See also STDFILT, PADARRAY.

%   Contributed by Jan Motl (jan@motl.us)
%   $Revision: 1.0 $  $Date: 2013/08/05 16:58:01 $


% Parameter checking.
numvarargs = length(varargin);
if numvarargs > 4
    error('myfuns:somefun2Alt:TooManyInputs', ...
          'requires at most 4 optional inputs');
end
 
optargs = {[3 3] 'false' 0};             % set defaults for optional inputs
optargs(1:numvarargs) = varargin;
[window, corrected, padding] = optargs{:}; % use memorable variable names
m = window(1);
n = window(2);

if (ndims(image)~=2)                     % check for color pictures
    display('The input image must be a two dimensional array.')
    display('Consider using rgb2gray or similar function.')
    return
end

if ~isscalar(m)                          % check for window specification
    [m n] = size(m);
    display('STDFILT kernels are unsupported.')
    display('Continuing with assumption the kernel contains only ones...')
end

% Decide whether to use corrected variance estimate
if corrected
    normalisation = m*n/(m*n-1);    % denominator is 'n-1'
else
    normalisation = 1;              % denominator is 'n'
end

% Type conversion (integer sqrt is not supported on all MATLAB versions)
image = double(image);

% Mean value
mean = averagefilter(image, [m n], padding);

% Standard deviation
meanSquare = averagefilter(image.^2, [m n], padding);
deviation = (normalisation*(meanSquare - mean.^2)).^0.5;

Contact us