function J = vl_imdown(I, varargin)
% VL_IMDOWN  Downsample an image by two
%   J = VL_IMDOWN(I) downsamples the image I by half by discarding
%   each other pixel.
%
%   VL_IMDOWN() accepts the following options:
%
%   Method:: Sample
%     'Sample' downsamples the image by discarding
%     pixels. 'Average' instead averages groups of 2x2 pixels.
%
%   See also: VL_IMUP(), VL_HELP().

% Copyright (C) 2007-12 Andrea Vedaldi and Brian Fulkerson.
% All rights reserved.
%
% This file is part of the VLFeat library and is made available under
% the terms of the BSD license (see the COPYING file).

opts.method = 'sample' ;
opts = vl_argparse(opts, varargin) ;

switch lower(opts.method)
  case 'sample'
    J = I(1:2:floor(end-.5),1:2:floor(end-.5),:) ;

  case 'average'
    Iclass = class(I);
    I = double(I);
    J = ...
        I(1:2:end-1,1:2:end-1,:) + ...
        I(2:2:end,1:2:end-1,:) + ...
        I(1:2:end-1,2:2:end,:) + ...
        I(2:2:end,2:2:end,:) ;
    J = J / 4 ;
    eval(sprintf('J=%s(J);', Iclass));

  otherwise
    error('Unknown downsampling method ''%s''.', method) ;
end