Histogram equalization of grayscale images with NumPy

前端 未结 3 1226
独厮守ぢ
独厮守ぢ 2020-12-09 22:11

How to do histogram equalization for multiple grayscaled images stored in a NumPy array easily?

I have the 96x96 pixel NumPy data in this 4D format:

         


        
相关标签:
3条回答
  • 2020-12-09 22:39

    Moose's comment which points to this blog entry does the job quite nicely.

    For completeness I give an axample here using nicer variable names and a looped execution on 1000 96x96 images which are in a 4D array as in the question. It is fast (1-2 seconds on my computer) and only needs NumPy.

    import numpy as np
    
    def image_histogram_equalization(image, number_bins=256):
        # from http://www.janeriksolem.net/2009/06/histogram-equalization-with-python-and.html
    
        # get image histogram
        image_histogram, bins = np.histogram(image.flatten(), number_bins, density=True)
        cdf = image_histogram.cumsum() # cumulative distribution function
        cdf = 255 * cdf / cdf[-1] # normalize
    
        # use linear interpolation of cdf to find new pixel values
        image_equalized = np.interp(image.flatten(), bins[:-1], cdf)
    
        return image_equalized.reshape(image.shape), cdf
    
    if __name__ == '__main__':
    
        # generate some test data with shape 1000, 1, 96, 96
        data = np.random.rand(1000, 1, 96, 96)
    
        # loop over them
        data_equalized = np.zeros(data.shape)
        for i in range(data.shape[0]):
            image = data[i, 0, :, :]
            data_equalized[i, 0, :, :] = image_histogram_equalization(image)[0]
    
    0 讨论(0)
  • 2020-12-09 22:46

    Very fast and easy way is to use the cumulative distribution function provided by the skimage module. Basically what you do mathematically to proof it.

    from skimage import exposure
    import numpy as np
    def histogram_equalize(img):
        img = rgb2gray(img)
        img_cdf, bin_centers = exposure.cumulative_distribution(img)
        return np.interp(img, bin_centers, img_cdf)
    
    0 讨论(0)
  • 2020-12-09 22:49

    As of today janeriksolem's url is broken.

    I found however this gist that links the same page and claims to perform histogram equalization without computing the histogram.

    The code is:

    img_eq = np.sort(img.ravel()).searchsorted(img)
    
    0 讨论(0)
提交回复
热议问题