mirror of
https://github.com/wassname/scikit-image.git
synced 2026-07-18 12:40:14 +08:00
ENH: Promote as_windows to a utility function.
This commit is contained in:
@@ -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 +1,2 @@
|
||||
from .dtype import *
|
||||
from .shape import *
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user