Source code for ewoksndreg.math.filter
from enum import Enum
from typing import Optional
import numpy
from skimage.filters import difference_of_gaussians
from skimage.filters import gaussian
from skimage.filters import median
from skimage.filters import meijering
from skimage.filters import sato
from skimage.filters import sobel
from skimage.filters import window
[docs]
class WindowType(str, Enum):
boxcar = "boxcar"
triang = "triang"
blackman = "blackman"
hamming = "hamming"
hann = "hann"
bartlett = "bartlett"
flattop = "flattop"
parzen = "parzen"
bohman = "bohman"
blackmanharris = "blackmanharris"
nuttall = "nuttall"
barthann = "barthann"
cosine = "cosine"
exponential = "exponential"
tukey = "tukey"
taylor = "taylor"
lanczos = "lanczos"
[docs]
class FilterType(str, Enum):
gaussian = "gaussian"
median = "median"
sobel = "sobel"
sato = "sato"
meijering = "meijering"
[docs]
def preprocess(
image: numpy.ndarray,
apply_filter: Optional[FilterType] = None,
filter_parameter: float = 1,
apply_low_pass: float = 0.0,
apply_high_pass: float = 0.0,
apply_window: Optional[WindowType] = None,
pin_range: bool = False,
):
if filter_parameter == 0:
filter_parameter = 1
if apply_filter == "gaussian":
image = gaussian(image, filter_parameter)
if apply_filter == "median":
image = median(image, numpy.full((3, 3), 1))
elif apply_filter == "sobel":
image = sobel(image)
elif apply_filter == "sato":
image = sato(image, numpy.arange(1, filter_parameter * 2, 2))
elif apply_filter == "meijering":
image = meijering(image, numpy.arange(1, filter_parameter * 2, 2))
if apply_low_pass > 0 and apply_high_pass > apply_low_pass:
image = difference_of_gaussians(image, apply_low_pass, apply_high_pass)
elif apply_low_pass > 0:
image = difference_of_gaussians(image, apply_low_pass, max(image.shape))
elif apply_high_pass > 0:
image = difference_of_gaussians(image, 0, apply_high_pass)
if pin_range:
image = (image - image.min()) / (image.max() - image.min())
if apply_window:
image = image * window(apply_window, image.shape)
return image