changeset 9132:17584aa80567 octave-forge

blkproc: deprecating blkproc and replace by blockproc for matlab compatibility
author carandraug
date Fri, 09 Dec 2011 05:11:29 +0000
parents 0c610ad08509
children d7c1db2f9de3
files main/image/inst/blkproc.m main/image/inst/blockproc.m
diffstat 2 files changed, 212 insertions(+), 182 deletions(-) [+]
line wrap: on
line diff
--- a/main/image/inst/blkproc.m	Fri Dec 09 02:20:11 2011 +0000
+++ b/main/image/inst/blkproc.m	Fri Dec 09 05:11:29 2011 +0000
@@ -15,190 +15,16 @@
 
 ## -*- texinfo -*-
 ## @deftypefn {Function File} {@var{B} = } blkproc (@var{A}, [@var{m},@var{n}], @var{fun})
-## @deftypefnx {Function File} {@var{B} = } blkproc (@var{A}, [@var{m},@var{n}], @var{fun}, ...)
-## @deftypefnx {Function File} {@var{B} = } blkproc (@var{A}, [@var{m},@var{n}], [@var{mborder},@var{nborder}], @var{fun}, @var{...})
-## @deftypefnx {Function File} {@var{B} = } blkproc (@var{A}, 'indexed', ...)
-## Processes image in blocks using user-supplied function.
-##
-## @code{B=blkproc(A,[m,n],fun)} divides image @var{A} in
-## @var{m}-by-@var{n} blocks, and passes them to user-supplied function
-## @var{fun}, which result is concatenated to build returning matrix
-## @var{B}. If padding is needed to build @var{m}-by-@var{n}, it is added
-## at the bottom and right borders of the image.  0 is used as a padding
-## value.
-##
-## @code{B=blkproc(A,[m,n],fun,...)} behaves as described above but
-## passes extra parameters to function @var{fun}.
-##
-## @code{B=blkproc(A,[m,n],[mborder,nborder],fun,...)} behaves as
-## described but uses blocks which overlap with neighbour blocks.
-## Overlapping dimensions are @var{mborder} vertically and @var{nborder}
-## horizontally. This doesn't change the number of blocks in an image
-## (which depends only on size(@var{A}) and [@var{m},@var{n}]). Adding a
-## border requires extra padding on all edges of the image. 0 is used as
-## a padding value.
-##
-## @code{B=blkproc(A,'indexed',...)} assumes that @var{A} is an indexed
-## image, so it pads the image using proper value: 0 for uint8 and
-## uint16 images and 1 for double images. Keep in mind that if 'indexed'
-## is not specified padding is always done using 0.
-##
-## @seealso{colfilt,inline,bestblk}
+## This function has been deprecated. Please use @code{blockproc} instead which
+## has exactly the same syntax.
 ## @end deftypefn
 
-## Author:  Josep Mones i Teixidor <jmones@puntbarra.com>
-
 function B = blkproc(A, varargin)
-  if(nargin<3)
-    error("blkproc: invalid number of parameters.");
-  endif
-  
-  ## check 'indexed' presence
-  indexed=false;
-  p=1;
-  if(ischar(varargin{1}) && strcmp(varargin{1}, "indexed"))
-    indexed=true;
-    p+=1;
-    if(isa(A,"uint8") || isa(A,"uint16"))
-	padval=0;
-    else
-      padval=1; 
-    endif
-  else
-    padval=0;
-  endif
-
-  ## check [m,n]
-  if(!isvector(varargin{p}))
-    error("blkproc: expected [m,n] but param is not a vector.");
-  endif
-  if(length(varargin{p})!=2)
-    error("blkproc: expected [m,n] but param has wrong length.");
-  endif
-  sblk=varargin{p}(:);
-  p+=1;
-
-  ## check [mborder,nborder]
-  if(nargin<p)
-    error("blkproc: required parameters haven't been supplied.");
-  endif
-
-  if(isvector(varargin{p}) && isnumeric(varargin{p})) 
-    if(length(varargin{p})!=2)
-      error("blkproc: expected [mborder,nborder] but param has wrong length.");
-    endif
-    sborder=varargin{p}(:);
-    p+=1;
-  else
-    sborder=[0;0];
-  endif
-
-  ## check fun
-  ## TODO: add proper checks for this one
-  if(nargin<p)
-    error("blkproc: required parameters haven't been supplied.");
-  endif
-
-  fun=varargin{p};
-  if(!isa(fun,"function_handle") &&
-     !isa(fun,"inline function") &&
-     !ischar(fun))
-    error("blkproc: invalid fun parameter.");
-  endif
-  
-  ## remaining params are params to fun
-  ## extra params are p+1:nargin-1
-
-  ## First of all we calc needed padding which will be applied on bottom
-  ## and right borders
-  ## The "-" makes the function output needed elements to fill another
-  ## block directly
-  sp=mod(-size(A)',sblk);
-
-  if(any(sp))
-    A=padarray(A,sp,padval,'post');
-  endif
-
-  ## we store A size without border padding to iterate later
-  soa=size(A);
-  
-  ## If we have borders then we need more padding
-  if(any(sborder))
-    A=padarray(A,sborder,padval);
+  persistent warned = false;
+  if (! warned)
+    warned = true;
+    warning ("Octave:deprecated-function",
+             "blkproc has been deprecated, and will be removed from future versions of the image package. Please use blockproc instead.")
   endif
-
-  ## calculate end of block
-  eblk=sblk+sborder*2-1;
-
-  ## now we can process by blocks
-  ## we try to preserve fun return type by concatenating everything
-  for i=1:sblk(1):soa(1)
-    ## This assures r has the same class as returned by fun
-    r=feval(fun,A(i:i+eblk(1),1:1+eblk(2)),varargin{p+1:nargin-1});
-    for j=1+sblk(2):sblk(2):soa(2)
-      r=horzcat(r,feval(fun,A(i:i+eblk(1),j:j+eblk(2)),varargin{p+1:nargin-1}));
-    endfor
-    if(i==1) ## this assures B has the same class as A
-      B=r;
-    else
-      B=vertcat(B,r);
-    endif
-  endfor
+  B = blockproc (A, varargin);
 endfunction
-
-%!demo
-%! blkproc(eye(6),[2,2],inline("any(x(:))","x"))
-%! # Returns a 3-by-3 diagonal
-
-
-%!assert(blkproc(eye(6),[2,2],"sum"),blkproc(eye(6),[2,2],@sum));
-%!assert(blkproc(eye(6),[2,2],"sum"),blkproc(eye(6),[2,2],inline("sum(x)","x")));
-%!assert(blkproc(eye(6),[1,2],@sum),kron(eye(3),[1;1]));
-%!assert(blkproc(eye(6),[2,2],inline("any(x(:))","x")),eye(3)!=0);
-%!assert(blkproc(eye(6),[1,2],[1,1],inline("sum(x(:))","x")),[2,1,0;3,2,0;2,3,1;1,3,2;0,2,3;0,1,2]);
-%!assert(blkproc(eye(6),'indexed',[1,2],[1,1],inline("sum(x(:))","x")),[8,5,6;6,2,3;5,3,4;4,3,5;3,2,6;6,5,8]);
-%!assert(blkproc(eye(6),[2,3],[4,3],inline("sum(x(:))","x")),ones(3,2)*6);
-
-% Some int* and uint* tests
-%!assert(blkproc(eye(6),[2,2],inline("int8(sum(x(:)))","x")),eye(3,"int8")*2);
-
-% Padding is 0 even for indexed
-%!assert(blkproc(uint8(eye(6)),[1,2],[1,1],inline("sum(x(:))","x")),[2,1,0;3,2,0;2,3,1;1,3,2;0,2,3;0,1,2]);
-%!assert(blkproc(uint8(eye(6)),'indexed',[1,2],[1,1],inline("sum(x(:))","x")),[2,1,0;3,2,0;2,3,1;1,3,2;0,2,3;0,1,2]);
-%!assert(blkproc(uint16(eye(6)),[1,2],[1,1],inline("sum(x(:))","x")),[2,1,0;3,2,0;2,3,1;1,3,2;0,2,3;0,1,2]);
-%!assert(blkproc(uint16(eye(6)),'indexed',[1,2],[1,1],inline("sum(x(:))","x")),[2,1,0;3,2,0;2,3,1;1,3,2;0,2,3;0,1,2]);
-
-
-%
-% $Log$
-% Revision 1.5  2007/03/23 16:14:36  adb014
-% Update the FSF address
-%
-% Revision 1.4  2007/01/04 23:44:22  hauberg
-% Minor changes in help text
-%
-% Revision 1.3  2007/01/04 23:37:54  hauberg
-% Minor changes in help text
-%
-% Revision 1.2  2006/10/08 21:41:04  adb014
-% check isnumeric for vector and 'function_handle' not 'function handle' in isa test
-%
-% Revision 1.1  2006/08/20 12:59:31  hauberg
-% Changed the structure to match the package system
-%
-% Revision 1.5  2005/09/08 02:00:17  pkienzle
-% [for Bill Denney] isstr -> ischar
-%
-% Revision 1.4  2004/11/15 16:04:20  pkienzle
-% Fix tests for functions which return boolean matrices
-%
-% Revision 1.3  2004/09/03 17:49:37  jmones
-% Improved uint8 and uint16 padding expections
-%
-% Revision 1.2  2004/09/03 13:40:13  jmones
-% Check result has same class as function result, and improved fun param checking
-%
-% Revision 1.1  2004/08/15 19:27:46  jmones
-% blkproc: block process an image using user-supplied function
-%
-%
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/image/inst/blockproc.m	Fri Dec 09 05:11:29 2011 +0000
@@ -0,0 +1,204 @@
+## Copyright (C) 2004 Josep Mones i Teixidor
+##
+## 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 2 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{B} = } blockproc (@var{A}, [@var{m},@var{n}], @var{fun})
+## @deftypefnx {Function File} {@var{B} = } blockproc (@var{A}, [@var{m},@var{n}], @var{fun}, ...)
+## @deftypefnx {Function File} {@var{B} = } blockproc (@var{A}, [@var{m},@var{n}], [@var{mborder},@var{nborder}], @var{fun}, @var{...})
+## @deftypefnx {Function File} {@var{B} = } blockproc (@var{A}, 'indexed', ...)
+## Processes image in blocks using user-supplied function.
+##
+## @code{B=blockproc(A,[m,n],fun)} divides image @var{A} in
+## @var{m}-by-@var{n} blocks, and passes them to user-supplied function
+## @var{fun}, which result is concatenated to build returning matrix
+## @var{B}. If padding is needed to build @var{m}-by-@var{n}, it is added
+## at the bottom and right borders of the image.  0 is used as a padding
+## value.
+##
+## @code{B=blockproc(A,[m,n],fun,...)} behaves as described above but
+## passes extra parameters to function @var{fun}.
+##
+## @code{B=blockproc(A,[m,n],[mborder,nborder],fun,...)} behaves as
+## described but uses blocks which overlap with neighbour blocks.
+## Overlapping dimensions are @var{mborder} vertically and @var{nborder}
+## horizontally. This doesn't change the number of blocks in an image
+## (which depends only on size(@var{A}) and [@var{m},@var{n}]). Adding a
+## border requires extra padding on all edges of the image. 0 is used as
+## a padding value.
+##
+## @code{B=blockproc(A,'indexed',...)} assumes that @var{A} is an indexed
+## image, so it pads the image using proper value: 0 for uint8 and
+## uint16 images and 1 for double images. Keep in mind that if 'indexed'
+## is not specified padding is always done using 0.
+##
+## @seealso{colfilt,inline,bestblk}
+## @end deftypefn
+
+## Author:  Josep Mones i Teixidor <jmones@puntbarra.com>
+
+function B = blockproc(A, varargin)
+  if(nargin<3)
+    print_usage;
+  endif
+  
+  ## check 'indexed' presence
+  indexed=false;
+  p=1;
+  if(ischar(varargin{1}) && strcmp(varargin{1}, "indexed"))
+    indexed=true;
+    p+=1;
+    if(isa(A,"uint8") || isa(A,"uint16"))
+	padval=0;
+    else
+      padval=1; 
+    endif
+  else
+    padval=0;
+  endif
+
+  ## check [m,n]
+  if(!isvector(varargin{p}))
+    error("blockproc: expected [m,n] but param is not a vector.");
+  endif
+  if(length(varargin{p})!=2)
+    error("blockproc: expected [m,n] but param has wrong length.");
+  endif
+  sblk=varargin{p}(:);
+  p+=1;
+
+  ## check [mborder,nborder]
+  if(nargin<p)
+    error("blockproc: required parameters haven't been supplied.");
+  endif
+
+  if(isvector(varargin{p}) && isnumeric(varargin{p})) 
+    if(length(varargin{p})!=2)
+      error("blockproc: expected [mborder,nborder] but param has wrong length.");
+    endif
+    sborder=varargin{p}(:);
+    p+=1;
+  else
+    sborder=[0;0];
+  endif
+
+  ## check fun
+  ## TODO: add proper checks for this one
+  if(nargin<p)
+    error("blockproc: required parameters haven't been supplied.");
+  endif
+
+  fun=varargin{p};
+  if(!isa(fun,"function_handle") &&
+     !isa(fun,"inline function") &&
+     !ischar(fun))
+    error("blockproc: invalid fun parameter.");
+  endif
+  
+  ## remaining params are params to fun
+  ## extra params are p+1:nargin-1
+
+  ## First of all we calc needed padding which will be applied on bottom
+  ## and right borders
+  ## The "-" makes the function output needed elements to fill another
+  ## block directly
+  sp=mod(-size(A)',sblk);
+
+  if(any(sp))
+    A=padarray(A,sp,padval,'post');
+  endif
+
+  ## we store A size without border padding to iterate later
+  soa=size(A);
+  
+  ## If we have borders then we need more padding
+  if(any(sborder))
+    A=padarray(A,sborder,padval);
+  endif
+
+  ## calculate end of block
+  eblk=sblk+sborder*2-1;
+
+  ## now we can process by blocks
+  ## we try to preserve fun return type by concatenating everything
+  for i=1:sblk(1):soa(1)
+    ## This assures r has the same class as returned by fun
+    r=feval(fun,A(i:i+eblk(1),1:1+eblk(2)),varargin{p+1:nargin-1});
+    for j=1+sblk(2):sblk(2):soa(2)
+      r=horzcat(r,feval(fun,A(i:i+eblk(1),j:j+eblk(2)),varargin{p+1:nargin-1}));
+    endfor
+    if(i==1) ## this assures B has the same class as A
+      B=r;
+    else
+      B=vertcat(B,r);
+    endif
+  endfor
+endfunction
+
+%!demo
+%! blockproc(eye(6),[2,2],inline("any(x(:))","x"))
+%! # Returns a 3-by-3 diagonal
+
+
+%!assert(blockproc(eye(6),[2,2],"sum"),blockproc(eye(6),[2,2],@sum));
+%!assert(blockproc(eye(6),[2,2],"sum"),blockproc(eye(6),[2,2],inline("sum(x)","x")));
+%!assert(blockproc(eye(6),[1,2],@sum),kron(eye(3),[1;1]));
+%!assert(blockproc(eye(6),[2,2],inline("any(x(:))","x")),eye(3)!=0);
+%!assert(blockproc(eye(6),[1,2],[1,1],inline("sum(x(:))","x")),[2,1,0;3,2,0;2,3,1;1,3,2;0,2,3;0,1,2]);
+%!assert(blockproc(eye(6),'indexed',[1,2],[1,1],inline("sum(x(:))","x")),[8,5,6;6,2,3;5,3,4;4,3,5;3,2,6;6,5,8]);
+%!assert(blockproc(eye(6),[2,3],[4,3],inline("sum(x(:))","x")),ones(3,2)*6);
+
+% Some int* and uint* tests
+%!assert(blockproc(eye(6),[2,2],inline("int8(sum(x(:)))","x")),eye(3,"int8")*2);
+
+% Padding is 0 even for indexed
+%!assert(blockproc(uint8(eye(6)),[1,2],[1,1],inline("sum(x(:))","x")),[2,1,0;3,2,0;2,3,1;1,3,2;0,2,3;0,1,2]);
+%!assert(blockproc(uint8(eye(6)),'indexed',[1,2],[1,1],inline("sum(x(:))","x")),[2,1,0;3,2,0;2,3,1;1,3,2;0,2,3;0,1,2]);
+%!assert(blockproc(uint16(eye(6)),[1,2],[1,1],inline("sum(x(:))","x")),[2,1,0;3,2,0;2,3,1;1,3,2;0,2,3;0,1,2]);
+%!assert(blockproc(uint16(eye(6)),'indexed',[1,2],[1,1],inline("sum(x(:))","x")),[2,1,0;3,2,0;2,3,1;1,3,2;0,2,3;0,1,2]);
+
+
+%
+% $Log$
+% Revision 1.5  2007/03/23 16:14:36  adb014
+% Update the FSF address
+%
+% Revision 1.4  2007/01/04 23:44:22  hauberg
+% Minor changes in help text
+%
+% Revision 1.3  2007/01/04 23:37:54  hauberg
+% Minor changes in help text
+%
+% Revision 1.2  2006/10/08 21:41:04  adb014
+% check isnumeric for vector and 'function_handle' not 'function handle' in isa test
+%
+% Revision 1.1  2006/08/20 12:59:31  hauberg
+% Changed the structure to match the package system
+%
+% Revision 1.5  2005/09/08 02:00:17  pkienzle
+% [for Bill Denney] isstr -> ischar
+%
+% Revision 1.4  2004/11/15 16:04:20  pkienzle
+% Fix tests for functions which return boolean matrices
+%
+% Revision 1.3  2004/09/03 17:49:37  jmones
+% Improved uint8 and uint16 padding expections
+%
+% Revision 1.2  2004/09/03 13:40:13  jmones
+% Check result has same class as function result, and improved fun param checking
+%
+% Revision 1.1  2004/08/15 19:27:46  jmones
+% blockproc: block process an image using user-supplied function
+%
+%