误差扩散原理

误差扩散法在数据处理中经常碰到, 尤其是用于图象处理中, 降低色彩的深度. 下面三张图, 图1 是 256 级灰度过度, 图 2 是简单的将图一按就近原则, 转换成了 16 级灰度. (直接把 8bit 灰度的后 4bit 砍掉) 图3 是将图 1 用误差扩散的方法转换成 16 级灰度.

801 字节646 字节2539 字节
图一图二图三
很明显, 同是 16 色, 但是图三的效果明显好于图二. 其原因是使用的误差扩散算法. 顾名思义, 误差扩散, 就是将色彩深度降低时, 将像素颜色的变化误差, 扩散开去. 这使得肉眼在观察图片的时候, 相邻的像素点集合整体的误差变小. 下面举一例来说明要容易理解的多:

在原256 级灰度图象上有一个点, 灰度值是 120 (0~255), 如果我们要将这张图转换成 16 级灰度, 最简单的方法是将每个像素点除以 16. 那么转换后的值就是 120/16=7.5 保留整数位后就是 7 . 这样转换后的值就有了 0.5 的误差. 最简单的误差扩散方法是将这 0.5 的误差放到这个点右边/下边的点上, 我们可以按 3:2:3 的比例把它分配到右边, 右下, 下边的点上. 即, 我们把右边和下边的点加上 (0.5*16)*3/8=3, 把右下的点加上 (0.5*16)*2/8=2. 这样处理完整个图形, 要比直接截尾的效果要好的多. 实际上, 3:2:3 的误差分配方案并不算好. 你还可以试试 7:3:5:1 的分法:

 X7
351
或者 42 分:
  X84
24842
12421
当然也不一定复杂的 Filter 就一定效果更好, 还是要视图象而定.

我觉得这个方法很容易理解, 就不多写了, 可以将其很容易的扩展到彩色图象的处理. (只需要将颜色分成 R G B 三色素) 另外, 不光是图象处理, 这个算法在别的一些数据处理中也常用到.

来自 http://www.codingnow.com/2000/frame.htm?http://www.codingnow.com/2000/gamedev/tips/errordif

http://www.codingnow.com/2000/gamedev.htm?special

参考 http://blog.csdn.net/grimraider/article/details/7449278

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值