Source code for compimg.windows
"""
Module with SlidingWindow interface and its implementations.
"""
import abc
import itertools
import numpy as np
from typing import Generator, Tuple
Rows = int
Columns = int
[docs]class SlidingWindow(abc.ABC):
[docs] @abc.abstractmethod
def slide(self, image: np.ndarray) -> Generator[np.ndarray, None, None]:
"""
Using some windows slides over image returning its changed/unchanged
fragments.
:param image: Image to slide over.
:return: Generator that returns views returned by window.
"""
[docs]class IdentitySlidingWindow(SlidingWindow):
"""
Slides through the image without making any changes.
"""
def __init__(self, shape: Tuple[Rows, Columns],
stride: Tuple[Rows, Columns]):
self._shape = shape
self._stride = stride
[docs] def slide(self, image: np.ndarray) -> Generator[np.ndarray, None, None]:
starting_rows_range = range(0, image.shape[0], self._stride[0])
starting_columns_range = range(0, image.shape[1], self._stride[1])
starting_row_indices = itertools.takewhile(
lambda index: index + self._shape[0] <= image.shape[0],
starting_rows_range
)
starting_column_indices = itertools.takewhile(
lambda index: index + self._shape[1] <= image.shape[1],
starting_columns_range
)
return (image[i:i + self._shape[0], j:j + self._shape[1]] for i, j in
itertools.product(starting_row_indices,
starting_column_indices))