前言:本文原发表在新浪博客http://blog.sina.com.cn/s/blog_b27f71160101ggzd.html,现新浪博客将其搬家至CSDN,原新浪博客停止更新。
①申请搬家后,迟迟未能收到申请搬家的码
②再熟悉一下算法
③联系键盘打字
基于以上三点,遂将博文重新敲一遍。
一、算法简介
误差扩撒法在数据处理中经常碰到,尤其是用于图像处理中,降低色彩的深度。下面有三张图,【图一】256级(8bit)灰度过度 【图二】将图一转换成16级(8bit)灰度(高4位不变,低4位置0) 【图三】将图一用误差扩散法转换成16级灰度。(256级灰度指共256种灰度值,16级灰度指共16种灰度值)
【图一】 【图二】 【图三】
很明显,同是16级灰度,但是【图三】的效果明显好于【图二】,其原因是【图二】使用的是误差扩撒算法。
顾名思义,误差扩撒,就是色彩深度降低时,将像素的变化的误差扩撒开去,使得肉眼在观察图片的时候,相邻的像素点集合整体的误差变小,就比如:人在下楼梯时,如果台阶过高,容易扯着蛋;要是同样的高度能多有几个台阶,那么台阶之间的距离变小了,那么扯蛋效应就会减小甚至消失(不好意思,我称之为扯蛋效应)。
二、具体过程
1、如果我们要将这一张256级灰度的图片转换成16级灰度,最简单的办法就是将每个像素的后四位置0。例如256级灰度值是120,转换成16级灰度值则有:120/16=7.5,7*16=112,即16级灰度值为112,那么存在120-112=8(即0.5*16=8)的像素差值,这就是误差。如果不利用这个误差信息,则就是【图二】的效果。
2、误差扩散(抖动),为了解决【图二】的现象,我们来利用这个误差,即将这个误差扩散到该像素点的周围,而不是由该像素完全承担这个误差。这样从视觉方面来看,就会更平缓,更容易接受。我们按照3:2:3的比例将8这个误差分批到该像素点的右边,右下,下边这些周围的像素点上,即右边像素=右边像素+3,右下像素=右下像素+2,下边像素=下边像素+3,如此一来,处理完整个图像的每个像素点,是不是比直接截尾的效果要好很多呢?
在上述说明中这个误差8的举例有点特殊,误差是13,则按3:2:3得分配的误差为2,1,2(或者四舍五入的3,2,3)。
事实上,3:2:3的效果也不是最好的分配误差法案,你还可以试一试下面的分法(也可以自己构造):
其中X指的是要转换的像素点,周围的瓜分误差的比例。
ok,这个算法还是比较有用的,由于比较简单,就不给出代码了,可以自己实现一下。
原文地址:http://blog.csdn.net/hujingshuang/article/details/45716445