Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 挤压/扩散直方图以设置其百分位数值_Python_Image_Opencv_Histogram_Distribution - Fatal编程技术网

Python 挤压/扩散直方图以设置其百分位数值

Python 挤压/扩散直方图以设置其百分位数值,python,image,opencv,histogram,distribution,Python,Image,Opencv,Histogram,Distribution,我希望通过将图像的通道(RGB)直方图百分比值设置为: 25便士-63.75英镑 50便士(中位数)-127.5英镑 75P-191.25 想法是首先移动所有直方图,使中值设置为127.5,然后扩展/压缩直方图,以便在尽可能保持直方图形状的同时设置25/75个百分位 我试图实现这一点,虽然我确实得到了我想要的百分位数值,但直方图的形状变化很大,总是看起来像3高斯分布(参见图中) 上限=255.0 下限=0.0 中位数=上限/2 P25=上限/4 P75=3*P25 def范围_传输(通道、旧_最

我希望通过将图像的通道(RGB)直方图百分比值设置为:
25便士-63.75英镑
50便士(中位数)-127.5英镑
75P-191.25

想法是首先移动所有直方图,使中值设置为127.5,然后扩展/压缩直方图,以便在尽可能保持直方图形状的同时设置25/75个百分位

我试图实现这一点,虽然我确实得到了我想要的百分位数值,但直方图的形状变化很大,总是看起来像3高斯分布(参见图中)

上限=255.0
下限=0.0
中位数=上限/2
P25=上限/4
P75=3*P25
def范围_传输(通道、旧_最小值、旧_最大值、新_最小值、新_最大值):
new_channel=channel.copy()
旧的范围=(旧的最大值-旧的最小值)
如果旧_范围==0:
如果新的_max==P25:
新建_频道[:]=新建_最大值
其他:
新频道[:]=新频道
其他:
新建范围=(新建最大值-新建最小值)
新_频道=((频道-旧_分钟)*新_范围)/旧_范围)+新_分钟
返回新频道
def均衡器_通道(通道):
中央分隔带=中央分隔带(通道)
shift\u med=中间值-Chu med
新建信道=信道+移位信道
ch_p25=百分位数(新通道,25)
ch_p75=百分位数(新通道,75)
新频道[新频道=频道p75]
返回新频道

你能帮我做这个吗

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