From fce9de633dac18b2598d301ded9ce3c5f39a6f5f Mon Sep 17 00:00:00 2001 From: Stefan van der Walt Date: Wed, 8 Feb 2012 02:09:33 -0800 Subject: [PATCH] ENH: Promote as_windows to a utility function. --- skimage/measure/_structural_similarity.py | 42 ++----------------- .../tests/test_structural_similarity.py | 13 +----- skimage/util/__init__.py | 1 + skimage/util/shape.py | 40 ++++++++++++++++++ 4 files changed, 46 insertions(+), 50 deletions(-) diff --git a/skimage/measure/_structural_similarity.py b/skimage/measure/_structural_similarity.py index ab2098f2..1837322a 100644 --- a/skimage/measure/_structural_similarity.py +++ b/skimage/measure/_structural_similarity.py @@ -3,43 +3,9 @@ from __future__ import division __all__ = ['structural_similarity'] import numpy as np -from numpy.lib import stride_tricks from ..util.dtype import dtype_range - -def _as_windows(X, win_size=7, flatten_first_axis=True): - """Re-stride an array to simulate a sliding window. - - Parameters - ---------- - X : 2D-ndarray - Input image. - - Returns - ------- - window : (N, M, win_size, win_size) ndarray - Sliding windows. - - """ - if not X.ndim == 2: - raise ValueError('Input images must be 2-dimensional.') - - X = np.ascontiguousarray(X) - r, c = X.shape - - strides = X.strides - row_jump, el_jump = strides - half_width = (win_size // 2) - - new_strides = (row_jump, el_jump, row_jump, el_jump) - new_rows = r - 2 * half_width - new_cols = c - 2 * half_width - new_shape = (new_rows, new_cols, win_size, win_size) - - windows = stride_tricks.as_strided(X, shape=new_shape, strides=new_strides) - - return windows - +from ..util.shape import as_windows def structural_similarity(X, Y, win_size=7, gradient=False, dynamic_range=None): @@ -88,8 +54,8 @@ def structural_similarity(X, Y, win_size=7, dmin, dmax = dtype_range[X.dtype.type] dynamic_range = dmax - dmin - XW = _as_windows(X, win_size=win_size) - YW = _as_windows(Y, win_size=win_size) + XW = as_windows(X, win_size=win_size) + YW = as_windows(Y, win_size=win_size) NS = len(XW) NP = win_size * win_size @@ -128,7 +94,7 @@ def structural_similarity(X, Y, win_size=7, ) grad = np.zeros_like(X, dtype=float) - OW = _as_windows(grad, win_size=win_size) + OW = as_windows(grad, win_size=win_size) OW += local_grad grad /= NS diff --git a/skimage/measure/tests/test_structural_similarity.py b/skimage/measure/tests/test_structural_similarity.py index e68420b9..ec5486fb 100644 --- a/skimage/measure/tests/test_structural_similarity.py +++ b/skimage/measure/tests/test_structural_similarity.py @@ -1,8 +1,7 @@ import numpy as np from numpy.testing import assert_equal -from skimage.measure._structural_similarity import \ - structural_similarity as ssim, _as_windows +from skimage.measure import structural_similarity as ssim import scipy.optimize as opt def test_ssim_patch_range(): @@ -13,16 +12,6 @@ def test_ssim_patch_range(): assert(ssim(X, Y, win_size=N) < 0.1) assert_equal(ssim(X, X, win_size=N), 1) -def test_as_windows(): - X = np.arange(100).reshape((10, 10)) - W = _as_windows(X, win_size=7) - assert_equal(W.shape[:2], (4, 4)) - - W = _as_windows(X, win_size=3) - assert_equal(W[0, 0], [[0, 1, 2], - [10, 11, 12], - [20, 21, 22]]) - def test_ssim_image(): N = 100 X = (np.random.random((N, N)) * 255).astype(np.uint8) diff --git a/skimage/util/__init__.py b/skimage/util/__init__.py index 980e3880..8daaa60d 100644 --- a/skimage/util/__init__.py +++ b/skimage/util/__init__.py @@ -1 +1,2 @@ from .dtype import * +from .shape import * diff --git a/skimage/util/shape.py b/skimage/util/shape.py index 0126d2e3..0b82be1d 100644 --- a/skimage/util/shape.py +++ b/skimage/util/shape.py @@ -230,3 +230,43 @@ def view_as_windows(arr_in, window_shape): arr_out = as_strided(arr_in, shape=new_shape, strides=new_strides) return arr_out +======= +import numpy as np +from numpy.lib import stride_tricks + +__all__ = ['as_windows'] + +def as_windows(X, win_size=7): + """Re-stride an array to simulate a sliding window. + + Parameters + ---------- + X : 2D-ndarray + Input image. + win_size : int + Size of the sliding window. + + Returns + ------- + window : (N, M, win_size, win_size) ndarray + Sliding windows. + + """ + if not X.ndim == 2: + raise ValueError('Input images must be 2-dimensional.') + + X = np.ascontiguousarray(X) + r, c = X.shape + + strides = X.strides + row_jump, el_jump = strides + half_width = (win_size // 2) + + new_strides = (row_jump, el_jump, row_jump, el_jump) + new_rows = r - win_size + 1 + new_cols = c - win_size + 1 + new_shape = (new_rows, new_cols, win_size, win_size) + + windows = stride_tricks.as_strided(X, shape=new_shape, strides=new_strides) + + return windows