from functools import partial
import numpy as np
from skimage.exposure import cumulative_distribution
from sklearn.base import BaseEstimator, TransformerMixin
from divik.core import configurable, maybe_pool
[docs]@configurable
class HistogramEqualization(BaseEstimator, TransformerMixin):
"""Equalize histogram of the features to increase contrast
Based on https://github.com/scikit-image/scikit-image/blob/master/skimage/exposure/exposure.py#L187-L223
Parameters
----------
n_bins : int, default 256
Number of bins for histogram equalization.
n_jobs : int, default -1
Number of CPU cores to use during equalization
Attributes
----------
cdf_ : array
Values of cumulative distribution function for all the features
bins_ : array
Bin centers for all the features
"""
def __init__(self, n_bins: int = 256, n_jobs: int = -1):
self.n_bins = n_bins
self.n_jobs = n_jobs
[docs] def fit(self, X, y=None):
cdf = partial(cumulative_distribution, nbins=self.n_bins)
with maybe_pool(processes=self.n_jobs) as pool:
cdf_and_bins = pool.map(cdf, X.T)
self.cdf_, self.bins_ = zip(*cdf_and_bins)
return self