分类: C/C++
2011-09-19 09:08:03
算法
经典算法
下面以一幅3*2像素的简单图片(图C)为例,来说明灰度直方图均衡化的算法。
(图C)
图C的直方图:
注意看百分位(Percentile)这一项。一般软件的百分位是 当前色阶的像素数量÷总像素数量,而Photoshop不同,Photoshop显示的是 当前色阶与前面色阶的所有像素数量÷总像素数量。因此图C色阶为100时的百分位就是(3+2)/6=5/6=83.33%,这个百分位其实就是我们要求 的灰度值(范围0~1),把它转换成0~255的范围,要再乘255。
求出每个色阶的百分位之后,再乘255,就可以求出与其对应的灰度值来。
色阶 数量 出现频率 百分位 255*百分位
根据每个色阶的 色阶->255*百分位 的对应关系组成一个灰度映射表,然后根据映射表来修改原来图片每个像素的灰度值。对于图C,用128替换50,用212替换100,用255替换200。这样,灰度直方图的均衡化就完成了。
Photoshop的算法
经过经典算法均衡化的图片,最亮的像素值总是255,因为最后一级色阶(255)的百分位一定是100%。而最暗的是由色阶0的数量决定的,像素值不一定是0。
Photoshop通过对比度拉伸的方法使最暗的像素值变为0,其它像素也相应变暗,最亮的像素保持255不变。对比度拉伸后的效果可能会比经典算法稍显偏暗。
对比度拉伸的算法,类似于使用色阶调整命令把黑场设成Min时的效果,Min是指像素数量不为0的第一个色阶。
对比度拉伸的公式:C = (Level - Min) * Scale = (Level - Min) * 255 / (255-Min)
图C均衡化之后的灰度值分别是128、212、255,为了精确,我们使用保留2位小数的形式(127.50、212.42、255.00)来进行对比度拉伸的计算。
Min = 127.50 '均衡化之后的最小值
Scale = 255/(255-Min) = 2
(127.50-Min)*Scale = 0*2 = 0
(212.42-Min)*Scale = 84.92*2 = 170
(255.00-Min)*Scale = 127.5*2 = 255
'新的映射表:
50 -> 0
100 -> 170
200 -> 255
经典算法和Photoshop算法的直方图比较。
彩色算法
彩色的直方图均衡化其实就是对图像某个或多个颜色通道进行灰度直方图均衡化运算,常见的有以下几种方法:
Photoshop用的是第一种方法。