Python: Normalize image exposure

后端 未结 3 551
梦谈多话
梦谈多话 2021-02-06 04:38

I\'m working on a project to measure and visualize image similarity. The images in my dataset come from photographs of images in books, some of which have very high or low expos

3条回答
  •  野趣味
    野趣味 (楼主)
    2021-02-06 05:34

    I ended up using a numpy implementation of the histogram normalization method @user894763 pointed out. Just save the below as normalize.py then you can call:

    python normalize.py cats.jpg

    Script:

    import numpy as np
    from scipy.misc import imsave
    from scipy.ndimage import imread
    import sys
    
    def get_histogram(img):
      '''
      calculate the normalized histogram of an image
      '''
      height, width = img.shape
      hist = [0.0] * 256
      for i in range(height):
        for j in range(width):
          hist[img[i, j]]+=1
      return np.array(hist)/(height*width)
    
    def get_cumulative_sums(hist):
      '''
      find the cumulative sum of a numpy array
      '''
      return [sum(hist[:i+1]) for i in range(len(hist))]
    
    def normalize_histogram(img):
      # calculate the image histogram
      hist = get_histogram(img)
      # get the cumulative distribution function
      cdf = np.array(get_cumulative_sums(hist))
      # determine the normalization values for each unit of the cdf
      sk = np.uint8(255 * cdf)
      # normalize the normalization values
      height, width = img.shape
      Y = np.zeros_like(img)
      for i in range(0, height):
        for j in range(0, width):
          Y[i, j] = sk[img[i, j]]
      # optionally, get the new histogram for comparison
      new_hist = get_histogram(Y)
      # return the transformed image
      return Y
    
    img = imread(sys.argv[1])
    normalized = normalize_histogram(img)
    imsave(sys.argv[1] + '-normalized.jpg', normalized)
    

    Output:

提交回复
热议问题