Сжимайте / распространяйте гистограмму, чтобы установить значения ее процентилей - PullRequest
1 голос
/ 23 апреля 2020

Я хочу выровнять изображение, установив его процентили гистограммы каналов (RGB):
25P - 63,75
50P (медиана) - 127,5
75P - 191,25

Идея состоит в том, чтобы сначала сместить всю гистограмму, чтобы медиана была установлена ​​на 127,5, а затем распределить / сжать гистограмму, чтобы установить 25/75 процентили, при этом максимально поддерживая форму гистограммы.

Я пытался реализовать это, и в то время как я получаю значения процентилей, которые я хотел - форма гистограммы резко меняется и всегда выглядит как распределение 3 Гаусса (см. на рисунке).

UPPER_BOUND = 255.0
LOWER_BOUND = 0.0
MEDIAN = UPPER_BOUND/2
P25 = UPPER_BOUND/4
P75 = 3*P25

def range_transfer(channel, old_min, old_max, new_min, new_max):
   new_channel = channel.copy()
   old_range = (old_max - old_min)
   if old_range == 0:
      if new_max == P25:
          new_channel[:] = new_max
      else:
          new_channel[:] = new_min
   else:
      new_range = (new_max - new_min)
      new_channel = (((channel - old_min) * new_range) / old_range) + new_min
   return new_channel

def equalize_channel(channel):
   ch_med = np.median(channel)
   shift_med = MEDIAN - ch_med
   new_channel = channel + shift_med

   ch_p25 = np.percentile(new_channel,25)
   ch_p75 = np.percentile(new_channel,75)
   new_channel[new_channel <= ch_p25] = range_transfer(new_channel, np.min(new_channel), ch_p25, 
                                        LOWER_BOUND, P25)[new_channel <= ch_p25]
   new_channel[new_channel >= ch_p75] = range_transfer(new_channel, ch_p75, np.max(new_channel), P75, 
                                        UPPER_BOUND)[new_channel >= ch_p75]
   return new_channel

enter image description here

Не могли бы вы помочь мне с этим?

...