#!/usr/bin/env python
# vim: set fileencoding=utf-8 :

"""Base utilities for post-filtering vein images"""


class Filter(object):
    """Objects of this class filter the input image"""

    def __init__(self):
        pass

    def __call__(self, image, mask):
        """Inputs image and mask and outputs a filtered version of the image


        Parameters:

          image (numpy.ndarray): raw image to filter as 2D array of unsigned
              8-bit integers

          mask (numpy.ndarray): mask to normalize as 2D array of booleans


        Returns:

          numpy.ndarray: A 2D boolean array with the same shape and data type of
          the input image representing the filtered image.

        """

        raise NotImplementedError("You must implement the __call__ slot")


class NoFilter(Filter):
    """Applies no filtering on the input image, returning it without changes"""

    def __init__(self):
        pass

    def __call__(self, image, mask):
        """Inputs image and mask and outputs the image, without changes


        Parameters:

          image (numpy.ndarray): raw image to filter as 2D array of unsigned
              8-bit integers

          mask (numpy.ndarray): mask to normalize as 2D array of booleans


        Returns:

          numpy.ndarray: A 2D boolean array with the same shape and data type of
          the input image representing the filtered image.

        """

        return image


class HistogramEqualization(Filter):
    """Applies histogram equalization on the input image inside the mask.

    In this implementation, only the pixels that lie inside the mask will be
    used to calculate the histogram equalization parameters. Because of this
    particularity, we don't use Bob's implementation for histogram equalization
    and have one based exclusively on scikit-image.
    """

    def __init__(self):
        pass

    def __call__(self, image, mask):
        """Applies histogram equalization on the input image, returns filtered


        Parameters:

          image (numpy.ndarray): raw image to filter as 2D array of unsigned
              8-bit integers

          mask (numpy.ndarray): mask to normalize as 2D array of booleans


        Returns:

          numpy.ndarray: A 2D boolean array with the same shape and data type of
          the input image representing the filtered image.

        """

        from skimage.exposure import equalize_hist, rescale_intensity

        retval = rescale_intensity(
            equalize_hist(image, mask=mask), out_range=(0, 255)
        )

        # make the parts outside the mask totally black
        retval[~mask] = 0

        return retval
