直方图均衡化(Histogram equalization)
2016-01-19 17:11
218 查看
综述
直方图均衡化(Histogram equalization)常用于增强图片的整体对比度,特别对于那些有用的数据被相似数据所代表的情况。通过直方图均衡化将亮度更好的分布于直方图上,使得低对比度区域有了更高的对比度。该方法对于前景和背景都很暗或都很亮的情况有很好的调节效果。实现
假设有一个离散的灰度图像{x},对该图像进行直方图均衡化的具体步骤如下:原图灰度级概率统计
ni代表灰度级i出现的次数,Imin,Imax分别代表图像中最小,最大的灰度级别,L是均衡化后的灰度级数,那么灰度级i在该图片中出现的概率Px(i)可表示如下:
Px(i)=P(x=i)=nni,0≤i<L
该过程相当于将图像的直方图归一化到[0,1],所以最终的到的直方图也是归一化到[0,1]。
由累计直方图得到均衡化直方图
根据下式计算累计直方图:
cdfx(i)=∑j=0iPx(j)
将cdfx的灰度级范围从[Imin,Imax]归一化到[0,L−1],就得到了目标输出{y}的累计直方图cdfy,由cdfy就可以得到{y}的直方图,该直方图就是均衡化的。
以上叙述都是基于灰度图的,该算法也可以应用于彩色图像,只需要分别处理R、G、B三个通道即可。然而,色彩通道的关系会因为该算法的应用而改变,从而产生戏剧性的变化。
实例
对于如下图所示的size=8×8的8位灰度图片进行直方图均衡化处理。该图片的灰度值如下表所示:
首先,计算该图像的直方图,结果如下:
然后,根据直方图计算原始图像中小于等于每个灰度级的像素的个数(即将累计直方图中的值乘以图片大小:cdfx(i)×size,这样求得的均衡化直方图就不是归一化到[0,1],而是标准的直方图),结果如下:
原始灰度级i | cdfx(i)×size |
---|---|
52 | 1 |
55 | 4 |
58 | 6 |
59 | 9 |
60 | 10 |
… | … |
154 | 64 |
h(i)=round(cdfx(i)×size−min(cdfx(i)×size)size−min(cdfx(i)×size)×(L−1))
以原始灰度级55为例,均衡化后的灰度级h为:h(55)=4−164−1×(256−1)≈12,由于灰度级为整数,所以将求得的值四舍五入(round),同理可求得均衡化后对应的所有灰度级:
原始灰度级i | cdfx(i)×size | 均衡化后灰度级h |
---|---|---|
52 | 1 | 0 |
55 | 4 | 12 |
58 | 6 | 20 |
59 | 9 | 32 |
60 | 10 | 36 |
… | … | … |
154 | 64 | 255 |
原始图片与均衡化处理后的图片对比:
结束语
直方图均衡化只能解决整体曝光不足或曝光过度的问题,而对于实际应用中经常出现的光照不均匀问题处理效果不明显。相关文章推荐
- docker容器多服务——Supervisor
- Java-创建图片验证码
- AssetPostprocessor
- 每天一个linux命令(3):pwd命令
- 设计原则
- SQL 存储过程 解析XML
- poi导出excel中的问题
- iOS开发的准备过程
- 利用Java的反射与代理机制实现AOP
- dp Codeforces 429B B. Working out
- HCharts 柱状图和饼图
- FastJson--阿里巴巴公司开源的速度最快的Json和对象转换工具(转)
- 自带finish清除网络请求的Activity
- 分享自己的页游运维架构
- 百度地图
- FastDfs (二) Nginx 整合 Fastdfs
- android:windowBackground和android:windowIsTranslucent组合使用记录
- sql 语句练习
- linux 误删文件后 恢复
- C++中#define、typedef和const的区别