Mercurial > forge
changeset 2943:eab078c59852 octave-forge
Code cleanup and support for color images
author | hauberg |
---|---|
date | Wed, 17 Jan 2007 21:21:05 +0000 |
parents | fd4cdd72bf08 |
children | cd842698bc12 |
files | main/image/inst/fspecial.m main/image/inst/impad.m |
diffstat | 2 files changed, 84 insertions(+), 82 deletions(-) [+] |
line wrap: on
line diff
--- a/main/image/inst/fspecial.m Wed Jan 17 21:18:12 2007 +0000 +++ b/main/image/inst/fspecial.m Wed Jan 17 21:21:05 2007 +0000 @@ -90,7 +90,7 @@ radius = 5; endif ## Create the filter - [x,y] = meshgrid(-c2:c2, -r2:r2); + [x,y] = meshgrid(-radius:radius, -radius:radius); r = sqrt(x.^2 + y.^2); f = (r <= radius); ## Normalize the filter to integral 1
--- a/main/image/inst/impad.m Wed Jan 17 21:18:12 2007 +0000 +++ b/main/image/inst/impad.m Wed Jan 17 21:21:05 2007 +0000 @@ -56,87 +56,89 @@ ## A nice test matrix for padding: ## A = 10*[1:5]' * ones(1,5) + ones(5,1)*[1:5] -function retval = impad(A, xpad, ypad, padding, const) - -try empty_list_elements_ok_save = empty_list_elements_ok; -catch empty_list_elements_ok_save = 0; -end -try warn_empty_list_elements_save = warn_empty_list_elements; -catch warn_empty_list_elements_save = 0; -end -unwind_protect +function retim = impad(im, xpad, ypad, padding = "zeros", const = 1) + ## Input checking + if (!isgray(im) && !isrgb(im)) + error("impad: first input argument must be an image"); + endif + if (isscalar(xpad) && xpad >= 0) + xpad(2) = xpad; + elseif (!isreal(xpad) || numel(xpad) != 2 || any(xpad < 0)) + error("impad: xpad must be a positive scalar or 2-vector"); + endif + if (isscalar(ypad) && ypad >= 0) + ypad(2) = ypad; + elseif (!isreal(ypad) || numel(ypad) != 2 || any(ypad < 0)) + error("impad: ypad must be a positive scalar or 2-vector"); + endif + if (!isscalar(const)) + error("impad: fifth input argument must be a scalar"); + endif -if nargin < 4, padding = "zeros"; endif -if nargin < 5, const = 1; endif -if isscalar(xpad), xpad(2) = xpad(1); endif -if isscalar(ypad), ypad(2) = ypad(1); endif - -origx = size(A,2); -origy = size(A,1); -retx = origx + xpad(1) + xpad(2); -rety = origy + ypad(1) + ypad(2); - -empty_list_elements_ok = 1; -warn_empty_list_elements = 0; + origx = size(im,2); + origy = size(im,1); + retx = origx + xpad(1) + xpad(2); + rety = origy + ypad(1) + ypad(2); + cl = class(im); -if(strcmp(padding, "zeros")) - retval = zeros(rety,retx); - retval(ypad(1)+1 : ypad(1)+origy, xpad(1)+1 : xpad(1)+origx) = A; - elseif(strcmp(padding,"ones")) - retval = ones(rety,retx); - retval(ypad(1)+1 : ypad(1)+origy, xpad(1)+1 : xpad(1)+origx) = A; - elseif(strcmp(padding,"constant")) - retval = const.*ones(rety,retx); - retval(ypad(1)+1 : ypad(1)+origy, xpad(1)+1 : xpad(1)+origx) = A; - elseif(strcmp(padding,"replicate")) - y1 = origy-ypad(1)+1; - x1 = origx-xpad(1)+1; - if(y1 < 1 || x1 < 1 || ypad(2) > origy || xpad(2) > origx) - error("Too large padding for this padding type"); - else - yrange1 = y1 : origy; - yrange2 = 1 : ypad(2); - xrange1 = x1 : origx; - xrange2 = 1 : xpad(2); - retval = [ A(yrange1, xrange1), A(yrange1, :), A(yrange1, xrange2); - A(:, xrange1), A, A(:, xrange2); - A(yrange2, xrange1), A(yrange2, :), A(yrange2, xrange2) ]; - endif - elseif(strcmp(padding,"symmetric")) - y2 = origy-ypad(2)+1; - x2 = origx-xpad(2)+1; - if(ypad(1) > origy || xpad(1) > origx || y2 < 1 || x2 < 1) - error("Too large padding for this padding type"); - else - yrange1 = 1 : ypad(1); - yrange2 = y2 : origy; - xrange1 = 1 : xpad(1); - xrange2 = x2 : origx; - retval = [ fliplr(flipud(A(yrange1, xrange1))), flipud(A(yrange1, :)), fliplr(flipud(A(yrange1, xrange2))); - fliplr(A(:, xrange1)), A, fliplr(A(:, xrange2)); - fliplr(flipud(A(yrange2, xrange1))), flipud(A(yrange2, :)), fliplr(flipud(A(yrange2, xrange2))) ]; - endif - elseif(strcmp(padding,"reflect")) - y2 = origy-ypad(2); - x2 = origx-xpad(2); - if(ypad(1)+1 > origy || xpad(1)+1 > origx || y2 < 1 || x2 < 1) - error("Too large padding for this padding type"); - else - yrange1 = 2 : ypad(1)+1; - yrange2 = y2 : origy-1; - xrange1 = 2 : xpad(1)+1; - xrange2 = x2 : origx-1; - retval = [ fliplr(flipud(A(yrange1, xrange1))), flipud(A(yrange1, :)), fliplr(flipud(A(yrange1, xrange2))); - fliplr(A(:, xrange1)), A, fliplr(A(:, xrange2)); - fliplr(flipud(A(yrange2, xrange1))), flipud(A(yrange2, :)), fliplr(flipud(A(yrange2, xrange2))) ]; - endif - else - error("Unknown padding type"); -endif - -unwind_protect_cleanup - empty_list_elements_ok = empty_list_elements_ok_save; - warn_empty_list_elements = warn_empty_list_elements_save; -end_unwind_protect - + for iter = size(im,3):-1:1 + A = im(:,:,iter); + switch (lower(padding)) + case "zeros" + retval = zeros(rety, retx, cl); + retval(ypad(1)+1 : ypad(1)+origy, xpad(1)+1 : xpad(1)+origx) = A; + case "ones" + retval = ones(rety, retx, cl); + retval(ypad(1)+1 : ypad(1)+origy, xpad(1)+1 : xpad(1)+origx) = A; + case "constant" + retval = const.*ones(rety, retx, cl); + retval(ypad(1)+1 : ypad(1)+origy, xpad(1)+1 : xpad(1)+origx) = A; + case "replicate" + y1 = origy-ypad(1)+1; + x1 = origx-xpad(1)+1; + if (y1 < 1 || x1 < 1 || ypad(2) > origy || xpad(2) > origx) + error("impad: too large padding for this padding type"); + else + yrange1 = y1:origy; + yrange2 = 1:ypad(2); + xrange1 = x1:origx; + xrange2 = 1:xpad(2); + retval = [ A(yrange1, xrange1), A(yrange1, :), A(yrange1, xrange2); + A(:, xrange1), A, A(:, xrange2); + A(yrange2, xrange1), A(yrange2, :), A(yrange2, xrange2) ]; + endif + case "symmetric" + y2 = origy-ypad(2)+1; + x2 = origx-xpad(2)+1; + if (ypad(1) > origy || xpad(1) > origx || y2 < 1 || x2 < 1) + error("impad: too large padding for this padding type"); + else + yrange1 = 1 : ypad(1); + yrange2 = y2 : origy; + xrange1 = 1 : xpad(1); + xrange2 = x2 : origx; + retval = [ fliplr(flipud(A(yrange1, xrange1))), flipud(A(yrange1, :)), fliplr(flipud(A(yrange1, xrange2))); + fliplr(A(:, xrange1)), A, fliplr(A(:, xrange2)); + fliplr(flipud(A(yrange2, xrange1))), flipud(A(yrange2, :)), fliplr(flipud(A(yrange2, xrange2))) ]; + endif + case "reflect" + y2 = origy-ypad(2); + x2 = origx-xpad(2); + if (ypad(1)+1 > origy || xpad(1)+1 > origx || y2 < 1 || x2 < 1) + error("impad: too large padding for this padding type"); + else + yrange1 = 2 : ypad(1)+1; + yrange2 = y2 : origy-1; + xrange1 = 2 : xpad(1)+1; + xrange2 = x2 : origx-1; + retval = [ fliplr(flipud(A(yrange1, xrange1))), flipud(A(yrange1, :)), fliplr(flipud(A(yrange1, xrange2))); + fliplr(A(:, xrange1)), A, fliplr(A(:, xrange2)); + fliplr(flipud(A(yrange2, xrange1))), flipud(A(yrange2, :)), fliplr(flipud(A(yrange2, xrange2))) ]; + endif + otherwise + error("impad: unknown padding type"); + endswitch + + retim(:,:,iter) = retval; + endfor endfunction