## Copyright (C) 2013 Brandon Miles  <brandon.miles7 at gmail.com>
## 
## This program is free software; you can redistribute it and/or modify it
## under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3 of the License, or
## (at your option) any later version.
## 
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
## 
## You should have received a copy of the GNU General Public License
## along with this program.  If not, see <http://www.gnu.org/licenses/>.

## -*- texinfo -*- 
## @deftypefn {Function File} {[@var{gradMag}, @var{gradDir}] =} imgradientxy (@var{image}, @var{method})
## Compute the x and y gradients of an image using various methods.  The first input @var{image} is the gray
## scale image to compute the edges on.  The second input controls the method used to calculate 
## the gradients.  The first output @var{gradMag} returns the magnitude of the gradient.  The second output
## @var{gradDir} returns the direction in degrees.  
##
## The @var{method} input argument can be any of the following strings (the default
## value is "Sobel")
##
## @table @asis
## @item "Sobel"
## Calculates the gradient in @var{image} using the Sobel approximation to the
## derivatives.
##
## @item "Prewitt"
## Calculates the gradient in @var{image} using the Prewitt approximation to the
## derivatives. This method works just like "Sobel" except a different aproximation of
## the gradient is used.
##
## @item "Central Difference"
## Calculates the gradient in @var{image} using the central difference approximation to the
## derivatives: (x(i-1) - x(i+1))/2.
##
## @item "Intermediate Difference"
## Calculates the gradient in @var{image} using the intermediate difference approximation to
## the derivatives: x(i) - x(i+1).
##
## @end table
##
## @seealso{edge, gradientxy}
## @end deftypefn

function [gradX gradY] = imgradientxy (image, method)
  ## Get the image
  if (nargin == 0)
    error("edge: not enough input arguments");
  endif
  if ( ndims(image) > 2 )
    error("edge: first input must be a gray-scale image");
  endif

  ## Get the method
  if (nargin == 1)
    method = "Sobel";
  endif
  if (!ischar(method))
    error("edge: second argument must be a string");
  endif
  method = lower(method);
 
  switch(method)
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% Sobel, Prewitt
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'sobel','prewitt'}
      ker = fspecial(method); # horizontal
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% Central Difference
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
    case {'centraldifference'}
      ker = [0.5; 0; -0.5];
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %% Intermediate Difference
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'intermediatedifference'}
      ker = [1; -1];
 
    otherwise
      error('Unrecognized method');
  end
  
  gradX = conv2(image, ker', 'same');
  gradY = conv2(image, ker, 'same');

endfunction
