python直方图均衡化直观理解

来源:互联网 发布:linux oracle rpm安装 编辑:程序博客网 时间:2024/05/20 08:26

直方图均衡化是灰度变化中常用的一种非常有用的变化方式,可以用作增强对比度,思想也比较简单,就是使得变化后的图像每个灰度值概率分布相同。

代码

import numpy as npdef histeq(im,nbr_bins=256):    '''对灰度图进行直方图均衡化'''    #计算直方图    imhist,bins = np.histogram(im.flatten(),nbr_bins,normed=True)    cdf = imhist.cumsum()   #累积分布函数 cumulative distribution function    cdf = 255*cdf/cdf[-1]   #归一化(灰度变换函数)    #使用累积分布函数的线性插值,计算新的像素值    im2 = np.interp(im.flatten(),bins[:-1],cdf)    return im2.reshape(im.shape),cdf

效果

变换前
1.png
变换后
3.png
变换函数
2.png

直观理解变换函数以及插值的作用

  1. 计算直方图,知道每个像素值的个数
  2. 计算累积分布函数,这个函数的本质就是像素个数累加值占总数的比重,也就是一个0~1之间的值
  3. 当灰度值分布概率相同时,累积分布函数为f(x)=x/255
  4. 将现在图像的累积分布函数的每个值映射到分布概率相同时应有的值,也就是x=f(x)*255
  5. 因为在Python里面,这个灰度变换函数不是严格意义上的函数,只是几个点,x轴是bins[:-1],y轴是cdf
  6. 插值的意思就是生成一个函数,刚好能通过指定点,与拟合的最小二乘逼近还是有点区别的
  7. np.interp(im.flatten(),bins[:-1],cdf)直接把im.flatten()的映射值得到

参考

  1. 《Python计算机视觉编程》
  2. http://blog.csdn.net/xiajun07061225/article/details/6910129
  3. http://blog.csdn.net/zrongh/article/details/7302816
0 0
原创粉丝点击