数字图像处理与机器视觉-4-直方图均衡化
以前做项目的时候碰到直方图均衡化,都是直接调用opencv里面的函数。但是主要是为了实现功能,再检查功能实现后图像的变化就完事了。
之前的微积分和概率论都忘的一干二净,所以在啃直方图均衡化这一节的时候略费劲。其实MATLAB自带直方图均衡化函数histeq,如果不关系过程的话,几行命令就可以实现并观看效果。为了加深理解,打算把推导过程走一遍。
必备技能!概率论和微积分,如果微积分和概率论基础不扎实的话建议简单复习下(下载地址)
为了推导直方图均衡化函数,先了解下什么是直方图均衡化:
直方图均衡化又叫灰度均衡化,直方图前面介绍过,来回忆一样,就是每一灰度级所出现的像素点的频率或次数。均衡化,我根据字面理解就是通过某种处理(灰度映射关系),将本来在每一灰度级分布不均匀的像素点,尽可能均匀地分布。比如某些比较暗的图片,通过直方图均衡化,使得图像具有较高的对比度和较大的动态范围。
直方图规定化(匹配)
直方图规定化就是给定一幅参考图S,按照S的直方图来重新映射原图的像素点,这就大概就是为什么又叫做直方图匹配的原因。
直方图规定化的好处就是,人为指定一幅我们想要的直方图分布曲线,然后将待规定化的图片按照我们想要的分布曲线来重新映射,相对于直方图均衡化,自由度更高,得到我们想要的结果。
具体推导过程可以参考:灰度图像直方图的规定化的原理及代码实现和MATLAB实现直方图规定化,这两篇文章结合起来看,原理就差不多了。
第一篇博文着重讲了规定化的原理,步骤总结的很精炼:
1.分别计算原图像与目标图像的累计概率分布;
2.分别对原图像与目标图像进行直方图均衡化操作;
3.利用组映射关系使原图像直方图按照规定进行变换;
映射图一定要自己过一遍,这样理解更深刻
然后两篇博文分别介绍了C++和MATLAB编程实现,放一下具体效果图: