From c2d308c21afd66880481a686b7c3ec0c099331c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Sch=C3=B6nberger?= Date: Fri, 5 Oct 2012 06:18:58 +0200 Subject: [PATCH] Add function to scale images --- skimage/transform/__init__.py | 2 +- skimage/transform/_warps.py | 43 +++++++++++++++++++++++++++ skimage/transform/tests/test_warps.py | 11 ++++++- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/skimage/transform/__init__.py b/skimage/transform/__init__.py index a55d5df4..3185bf1d 100644 --- a/skimage/transform/__init__.py +++ b/skimage/transform/__init__.py @@ -6,6 +6,6 @@ from ._geometric import (warp, warp_coords, estimate_transform, SimilarityTransform, AffineTransform, ProjectiveTransform, PolynomialTransform, PiecewiseAffineTransform) -from ._warps import swirl, homography, resize, rotate +from ._warps import swirl, homography, resize, rotate, scale from .pyramids import (pyramid_reduce, pyramid_expand, pyramid_gaussian, pyramid_laplacian) diff --git a/skimage/transform/_warps.py b/skimage/transform/_warps.py index 72f90050..2c508763 100644 --- a/skimage/transform/_warps.py +++ b/skimage/transform/_warps.py @@ -52,6 +52,49 @@ def resize(image, output_shape, order=1, mode='constant', cval=0.): mode=mode, cval=cval) +def scale(image, scale, order=1, mode='constant', cval=0.): + """Scale image. + + Parameters + ---------- + image : ndarray + Input image. + scale : {float, tuple of floats} + Scale factors. Separate scale factors can be defined as + `(row_scale, col_scale)`. + + Returns + ------- + scaled : ndarray + Scaled version of the input. + + Other parameters + ---------------- + order : int + Order of splines used in interpolation. See + `scipy.ndimage.map_coordinates` for detail. + mode : string + How to handle values outside the image borders. See + `scipy.ndimage.map_coordinates` for detail. + cval : string + Used in conjunction with mode 'constant', the value outside + the image boundaries. + + """ + + try: + rscale, cscale = scale + except TypeError: + rscale = cscale = scale + + orig_rows, orig_cols = image.shape[0], image.shape[1] + rows = np.round(rscale * orig_rows) + cols = np.round(cscale * orig_cols) + output_shape = (rows, cols) + + return resize(image, output_shape, order=order, mode=mode, cval=cval) + + def rotate(image, angle, resize=False, order=1, mode='constant', cval=0.): """Rotate image by a certain angle around its center. diff --git a/skimage/transform/tests/test_warps.py b/skimage/transform/tests/test_warps.py index b705ac47..e0a768e8 100644 --- a/skimage/transform/tests/test_warps.py +++ b/skimage/transform/tests/test_warps.py @@ -2,7 +2,7 @@ from numpy.testing import assert_array_almost_equal, run_module_suite import numpy as np from scipy.ndimage import map_coordinates -from skimage.transform import (warp, warp_coords, rotate, resize, +from skimage.transform import (warp, warp_coords, rotate, resize, scale, AffineTransform, ProjectiveTransform, SimilarityTransform, homography) @@ -94,6 +94,15 @@ def test_resize(): assert_array_almost_equal(resized, ref) +def test_scale(): + x = np.zeros((5, 5), dtype=np.double) + x[1, 1] = 1 + scaled = scale(x, 2, order=0) + ref = np.zeros((10, 10)) + ref[2:4, 2:4] = 1 + assert_array_almost_equal(scaled, ref) + + def test_swirl(): image = img_as_float(data.checkerboard())