Я хочу выровнять изображение, установив его процентили гистограммы каналов (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
Не могли бы вы помочь мне с этим?