直方图的算法
看到论坛上有人认为计算直方图开销最大的是标准偏差,还有人认为有必要取消标准偏差的显示项以提高速度。其实标准偏差的计算量并不大,就看你怎么去计算了。前面讲过的一些算法的确会让人误以为计算这些数据时要对每个像素都进行加减乘除乘方等运算,所以我觉得有必要讨论一下直方图的具体计算过程。
要绘制直方图,首先要建立一个储存每种灰度数量的数据表(GrayTable),GrayTable是一个大小为256的数组。然后要对图像的每一个像素进行统计,把每种灰度的像素数量记录到GrayTable中。这一步是必须的,不能偷工减料,这部分的计算量与像素的数量成正比,因此图像越大,计算的速度就越慢。要想提高速度,唯一的方法就是使用缓存中的小图进行计算,但这样会降低精确度,不过对于实时更新的动态直方图来说,这么做还是很有必要的。
数据表GrayTable准备好了已后,平均值、中间值和标准偏差都可以利用GrayTable里的数据来计算,也就是说没必要再对每个像素进行计算了。无论图像有多大,GrayTable里都只存放256个数字,所以计算起来相当快。
举例来说,例如GrayTable中存放了以下的数据。

平均值 = (0*3 + 1*2 + 2*1 + 3*5 + 0 + 255*1) / (3+2+1+5+0+1) = 274/12 = 22.8
看到了吧,用乘法就行了,灰度值×数量再相加。标准偏差也是用类似的方法计算。GrayTable的灰度值是从小到大排列的,所以计算中间值也很方便。
对于动态直方图来说,也可以利用GrayTable来优化。有些时候,我们没有必要重新统计整幅图像的像素来更新直方图,只要把先前直方图的GrayTable里的数据调换一下位置就行了,这种方法仅限于单幅图像单像素的处理(点运算)。例如做反色运算后,新的直方图其实就是把原来的直方图左右翻转了一下。这样无论图像有多大,都可以做到精确的实时更新。

Photoshop图像菜单的功能几乎都可以使用这种优化,但Photoshop目前还没做到这一点,估计是怕麻烦吧。一些高画质数码照片处理软件可以考虑把这个功能加进去。
上文书转载自:灰鹿色彩笔记 http://hi.baidu.com/graydeer 感谢灰鹿同志超一流的教学水准! ----------------------------------------------------------------------------------------------- 下文书寥寥数字,却更堪称经典。
“直方图”里的色阶为什么只有225级?而不是255
相关引用 http://bbs.blueidea.com/thread-2892954-1-1.html

关于直方图的显示225的错误修改方法:
如果发现了有显示错误的现象,先关闭Photoshop,用记事本打开Photoshop安装目录下Required子目录中的tw10428.dat文件。
在打开的tw10428.dat中查找"$$$/HistogramPalette/StatText/Cache=高速缓存级别:",其位于第7667行。将高速级别4个字删除,只保留缓存2字。保存后退出。再启动Photoshop即可解决。删除和保留的文字可自行决定,但必须至少删除3个汉字才能解决问题。
注意: 修改tw10428.dat文件是Photoshop中文界面的字符文件,改动不当可能造成界面显示错误。如果删除该文件或移动出Required目录,Photoshop将以英文界面启动。因此请做好备份,谨慎操作。如果错误操作且无法挽回,必须重新安装Photoshop。
经典论坛交流: http://bbs.blueidea.com/thread-2892954-1-1.html
本文链接:http://www.blueidea.com/design/doc/2008/6268.asp
出处:灰鹿的色彩笔记
责任编辑:moby
上一页 什么是直方图? [5] 下一页
|