Source code for ewoksndreg.math.crop
import numpy as np
from typing import List, Tuple
[docs]
def crop_stack(stack: np.ndarray) -> np.ndarray:
"""
Crops the images to exclude all NaN values. Only works for translated images
param stack: Stack of translated images of form [N,H,W] with nan values in the empty sections
returns: Stack of cropped images of form [N, H', W']
"""
boolean = np.isnan(stack)
full_pixels = boolean.sum(axis=0) == 0
indices = np.nonzero(full_pixels)
new_shape = tuple([index.max() - index.min() + 1 for index in indices])
return stack[:, full_pixels].reshape((-1, *new_shape))
[docs]
def crop_edges(stack: np.ndarray) -> Tuple[slice, slice]:
"""
Calculates the slices such that they correspond to cropping out NaN values
param stack: Stack of translated images of form [N,H,W] with nan values in the empty sections
returns: two slices which crop the individual images to remove nan values
"""
boolean = np.isnan(stack)
full_pixels = boolean.sum(axis=0) == 0
indices = np.nonzero(full_pixels)
edges = [slice(index.min(), index.max() + 1) for index in indices]
return edges
[docs]
def calc_NaN_edges(image: np.ndarray) -> Tuple[Tuple[int, int], Tuple[int, int]]:
"""
Calculates the biggest subimage that doesn't contain NaN-values
Usable for situations where loading the entire stack is not feasible
----
param image: Translated image with potential NaN values on the edges
returns: two tuples containing the 4 borders of the image: ((top,left), (bottom,right))
"""
boolean = np.isnan(image) == 0
xindex, yindex = np.nonzero(boolean)
return (xindex.min(), yindex.min()), (xindex.max() + 1, yindex.max() + 1)
[docs]
def crop_translations(
transformations: List,
include: List[int],
img_size: Tuple,
interpolation_order: int = 1,
):
"""
Calculate the area of the images which doesn't include any NaN values based on the calculated transformations
param transformations: list of translations
param include: list of indices of the transformations which should be considered for cropping
param img_size: image size of the images that will be cropped
param interpolation_order: The order of the polynomials that will be used to resample the image, as higher orders create more NaN values
returns: two slices which crop the individual images to remove nan values
"""
order = interpolation_order
xshift = [
int(hom.passive[0, 2]) for i, hom in enumerate(transformations) if i in include
]
yshift = [
int(hom.passive[1, 2]) for i, hom in enumerate(transformations) if i in include
]
x0, x1 = order, img_size[0] - order
y0, y1 = order, img_size[1] - order
if min(xshift) < 0:
x0 += -min(xshift) + 1
if max(xshift) > 0:
x1 -= max(xshift) + 1
x = slice(x0, x1)
if min(yshift) < 0:
y0 += -min(yshift)
if max(yshift) > 0:
y1 -= max(yshift)
y = slice(y0, y1)
return (x, y)