Source code for neodroidvision.segmentation.masks.run_length_encoding

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy

__author__ = "Christian Heider Nielsen"
__doc__ = r"""

           Created on 20/10/2019
           """

__all__ = ["run_length_to_mask", "mask_to_run_length"]


[docs]def run_length_to_mask( mask_rle: str = "", shape: tuple = (1400, 2100) ) -> numpy.ndarray: """ Decode rle encoded mask. :param mask_rle: run-length as string formatted (start length) :param shape: (height, width) of array to return Returns numpy array, 1 - mask, 0 - background""" s = mask_rle.split() starts, lengths = [numpy.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])] starts -= 1 ends = starts + lengths img = numpy.zeros(shape[0] * shape[1], dtype=numpy.uint8) for lo, hi in zip(starts, ends): img[lo:hi] = 1 return img.reshape(shape, order="F")
[docs]def mask_to_run_length(img: numpy.ndarray) -> str: """ Convert mask to rle. img: numpy array, 1 - mask, 0 - background Returns run length as string formated""" pixels = img.T.flatten() pixels = numpy.concatenate([[0], pixels, [0]]) runs = numpy.where(pixels[1:] != pixels[:-1])[0] + 1 runs[1::2] -= runs[::2] return " ".join(str(x) for x in runs)