码迷,mamicode.com
首页 > 编程语言 > 详细

图像处理之误差扩散(抖动)算法

时间:2015-05-14 12:15:18      阅读:966      评论:0      收藏:0      [点我收藏+]

标签:误差扩撒   误差抖动   深度转换   

前言:本文原发表在新浪博客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

(1)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!