dlup.utils package#

Submodules#

dlup.utils.image module#

dlup.utils.image.check_if_mpp_is_valid(mpp_x: float, mpp_y: float, *, rel_tol: float = 0.015) None[source]#

Checks if the mpp is (nearly) isotropic and defined. The maximum allowed rel_tol

Parameters
mpp_xfloat
mpp_yfloat
rel_tolfloat

Relative tolerance between mpp_x and mpp_y. 1.5% seems to work well for most slides.

Returns
None

dlup.utils.imports module#

General utilities for module imports

dlup.utils.mask module#

Utilities to work with binary masks

dlup.utils.mask.dataset_to_polygon(dataset: dlup.data.dataset.TiledWsiDataset, index_map: dict[int, str], num_workers: int = 0, scaling: float = 1.0, show_progress: bool = True) dict[str, shapely.geometry.polygon.Polygon][source]#
dlup.utils.mask.mask_to_polygons(mask: numpy.ndarray[Any, numpy.dtype[numpy.int64]], offset: tuple[int | float, int | float] = (0, 0), scaling: float = 1.0) list[shapely.geometry.polygon.Polygon][source]#
Generates a list of Shapely polygons from the contours hierarchy returned by cv2.find_contours().

The list of polygons is generated by performing a depth-first search on the contours hierarchy tree.

Parameters
masknp.ndarray

Binary mask

offsettuple, optional

The offset for the polygon

scalingfloat, optional

The scaling for the polygon

Returns
list

The list of generated Shapely polygons

dlup.utils.pyvips_utils module#

dlup.utils.pyvips_utils.numpy_to_vips(data: numpy.ndarray[Any, numpy.dtype[numpy.int64]]) pyvips.vimage.Image[source]#

Convert a numpy array to a pyvips image.

Parameters
datanp.ndarray
Returns
pyvips.Image
dlup.utils.pyvips_utils.vips_to_numpy(vips_image: pyvips.vimage.Image) numpy.ndarray[Any, numpy.dtype[numpy.int64]][source]#

Convert a pyvips image to a numpy array.

Parameters
vips_imagepyvips.Image
Returns
np.ndarray

dlup.utils.tifffile_utils module#

dlup.utils.tifffile_utils.get_tile(page: tifffile.tifffile.TiffPage, coordinates: tuple[Any, ...], size: tuple[Any, ...]) numpy.ndarray[Any, numpy.dtype[numpy.int64]][source]#

Extract a crop from a TIFF image file directory (IFD).

Only the tiles englobing the crop area are loaded and not the whole page. This is useful for large Whole slide images that can’t fit into RAM.

Code obtained from [1].

Parameters
pageTiffPage

TIFF image file directory (IFD) from which the crop must be extracted.

coordinates: (int, int)

Coordinates of the top left and right corner corner of the desired crop.

size: (int, int)

Desired crop height and width.

Returns
outndarray of shape (imagedepth, h, w, sampleperpixel)

Extracted crop.

References

1

https://gist.github.com/rfezzani/b4b8852c5a48a901c1e94e09feb34743

Module contents#

class dlup.utils.ArrayEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)[source]#

Bases: json.encoder.JSONEncoder

Constructor for JSONEncoder, with sensible defaults.

If skipkeys is false, then it is a TypeError to attempt encoding of keys that are not str, int, float or None. If skipkeys is True, such items are simply skipped.

If ensure_ascii is true, the output is guaranteed to be str objects with all incoming non-ASCII characters escaped. If ensure_ascii is false, the output can contain non-ASCII characters.

If check_circular is true, then lists, dicts, and custom encoded objects will be checked for circular references during encoding to prevent an infinite recursion (which would cause an RecursionError). Otherwise, no such check takes place.

If allow_nan is true, then NaN, Infinity, and -Infinity will be encoded as such. This behavior is not JSON specification compliant, but is consistent with most JavaScript based encoders and decoders. Otherwise, it will be a ValueError to encode such floats.

If sort_keys is true, then the output of dictionaries will be sorted by key; this is useful for regression tests to ensure that JSON serializations can be compared on a day-to-day basis.

If indent is a non-negative integer, then JSON array elements and object members will be pretty-printed with that indent level. An indent level of 0 will only insert newlines. None is the most compact representation.

If specified, separators should be an (item_separator, key_separator) tuple. The default is (’, ‘, ‘: ‘) if indent is None and (‘,’, ‘: ‘) otherwise. To get the most compact JSON representation, you should specify (‘,’, ‘:’) to eliminate whitespace.

If specified, default is a function that gets called for objects that can’t otherwise be serialized. It should return a JSON encodable version of the object or raise a TypeError.

default(obj: Any) Any[source]#

Implement this method in a subclass such that it returns a serializable object for o, or calls the base implementation (to raise a TypeError).

For example, to support arbitrary iterators, you could implement default like this:

def default(self, o):
    try:
        iterable = iter(o)
    except TypeError:
        pass
    else:
        return list(iterable)
    # Let the base class default method raise the TypeError
    return JSONEncoder.default(self, o)