ENH: Promote as_windows to a utility function.

This commit is contained in:
Stefan van der Walt
2012-06-24 17:57:51 -07:00
parent 49b7eac4b5
commit fce9de633d
4 changed files with 46 additions and 50 deletions
+4 -38
View File
@@ -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
@@ -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)
+1
View File
@@ -1 +1,2 @@
from .dtype import *
from .shape import *
+40
View File
@@ -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