Histogram matching of two images in Python 2.x?

后端 未结 3 617
星月不相逢
星月不相逢 2020-12-04 11:34

I\'m trying to match the histograms of two images (in MATLAB this could be done using imhistmatch). Is there an equivalent function available from a standard Python library

3条回答
  •  孤街浪徒
    2020-12-04 12:20

    Here is yet another implementation based on this and scikit-image exposure's cumulative_distribution function which uses np.interp similar to ali_m's implementation. The input and template image is assumed to be gray-scale and with pixel values as integers in [0,255].

    from skimage.exposure import cumulative_distribution
    import matplotlib.pylab as plt
    import numpy as np
    
    def cdf(im):
     '''
     computes the CDF of an image im as 2D numpy ndarray
     '''
     c, b = cumulative_distribution(im) 
     # pad the beginning and ending pixels and their CDF values
     c = np.insert(c, 0, [0]*b[0])
     c = np.append(c, [1]*(255-b[-1]))
     return c
    
    def hist_matching(c, c_t, im):
     '''
     c: CDF of input image computed with the function cdf()
     c_t: CDF of template image computed with the function cdf()
     im: input image as 2D numpy ndarray
     returns the modified pixel values
     ''' 
     pixels = np.arange(256)
     # find closest pixel-matches corresponding to the CDF of the input image, given the value of the CDF H of   
     # the template image at the corresponding pixels, s.t. c_t = H(pixels) <=> pixels = H-1(c_t)
     new_pixels = np.interp(c, c_t, pixels) 
     im = (np.reshape(new_pixels[im.ravel()], im.shape)).astype(np.uint8)
     return im
    

    The output is shown below:

提交回复
热议问题