Source code for bowhead.util
import collections
import numpy
import skimage.filters, skimage.color
from .algorithm import _load
[docs]def image_gradient(image):
""" Preprocess bright-field or similar type images.
Applys a Scharr filter and normalizes the output gradient image.
Parameters
----------
image : [file path | numpy.ndarray | PIL.Image]
A color or grayscale image as file path
numpy array or PIL image.
Returns
-------
image : PIL.Image (8 bit image mode 'L')
A normalized image representing the gradient (edge magnitude)
of the input image.
"""
image = _load(image)
filename = image.filename
image = numpy.asarray(_load(image))
image = skimage.color.rgb2gray(image)
image = skimage.filters.scharr(image)
image = (255 * image / image.max()).astype('uint8')
image = _load(image).convert('L')
image.filename = filename
return image
[docs]def sort_and_cutoff(wounds, min_area=.05, abs_area=False):
"""Sort by time and cutoff based on minimum area.
Utillity function to sort wounds by time and filter out
wounds by minimum area (pixel^2).
Parameters
----------
wounds : sequence of dictionaries
A sequence of wound dictionaries representing an experimental
time series of the wound healing assay, as returned
by :func:`detect`.
min_area : float
Percentage (or absolute) image size to consider a
closed wound area.
After this limit is hit the following time points will be excluded
from the wound list.
abs_area : bool
Wether to use absolute area.
Returns
-------
wounds : list of dictionaries
A wound list sorted by time point of the wounds.
The following will remove wounds from the returned list:
- wound area smaller than ``min_area*image area`` or ``abs_area``
- wounds with later time point than the first removed
- None valued wounds
"""
if not isinstance(wounds, collections.Sequence):
raise ValueError('wounds argument is not a list')
wounds = [ws for ws in wounds if ws is not None]
wounds = sorted(wounds, key=lambda x: x['time'])
wounds_cut = []
for test in wounds:
img_area = test['image_area']
if abs_area:
if min_area > test['area']:
print('too small absolute area at time', test['time'])
break
elif min_area * img_area > test['area']:
print('too small area at time', test['time'])
break
wounds_cut.append(test)
return wounds_cut