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

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

一、算法简介

误差扩撒法在数据处理中经常碰到,尤其是用于图像处理中,降低色彩的深度。下面有三张图,【图一】256级(8bit)灰度过度      【图二】将图一转换成16级(8bit)灰度(高4位不变,低4位置0)       【图三】将图一用误差扩散法转换成16级灰度。(256级灰度指共256种灰度值,16级灰度指共16种灰度值)

801 字节         646 字节           2539 字节

【图一】                     【图二】                        【图三】

很明显,同是16级灰度,但是【图三】的效果明显好于【图二】,其原因是【图二】使用的是误差扩撒算法。

顾名思义,误差扩撒,就是色彩深度降低时,将像素的变化的误差扩撒开去,使得肉眼在观察图片的时候,相邻的像素点集合整体的误差变小,就比如:人在下楼梯时,如果台阶过高,容易扯着蛋;要是同样的高度能多有几个台阶,那么台阶之间的距离变小了,那么扯蛋效应就会减小甚至消失(不好意思,我称之为扯蛋效应)。

二、具体过程

1、如果我们要将这一张256级灰度的图片转换成16级灰度,最简单的办法就是将每个像素的后四位置0。例如256级灰度值是120,转换成16级灰度值则有:120/16=7.5,7*16=112,即16级灰度值为112,那么存在120-112=8(即0.5*16=8)的像素差值,这就是误差。如果不利用这个误差信息,则就是【图二】的效果。

256级灰度转化16级灰度方法:即把256级灰度平均分成16等分,转化的时候,只需要判断256级灰度在16等分中的哪一个区间,然后用该区间的最小值作为16级灰度的灰度值。即:

if((x>0) && (x<=16))
	Grayscale_value = 0=16;
else if((x > 16)&&( x<=32))
	Grayscale_value = 32;
else if((x > 32)&&( x<=48))
	Grayscale_value = 48;
else if((x > 48)&&( x<=64))
	Grayscale_value = 64;
else if((x > 64)&&( x<=80))
	Grayscale_value = 80;
else if((x > 80)&&( x<=96))
	Grayscale_value = 96;
else if((x > 96)&&( x<=112))
	Grayscale_value = 112;
else if((x > 112)&&( x<=128))
	Grayscale_value = 128;
else if((x > 128)&&( x<=144))
	Grayscale_value = 144;
else if((x > 144)&&( x<=160))
	Grayscale_value = 160;
else if((x > 160)&&( x<=176))
	Grayscale_value = 176;
else if((x > 176)&&( x<=182))
	Grayscale_value = 182;
else if((x > 182)&&( x<=198))
	Grayscale_value = 198;
else if((x > 198)&&( x<=214))
	Grayscale_value = 214;
else if((x > 214)&&( x<=230))
	Grayscale_value = 230;
else if((x > 230)&&( x<=246))
	Grayscale_value = 246;
else if((x > 246))
	Grayscale_value = 255;

也可以像原作者那样直接按照公式计算。
2、误差扩散(抖动),为了解决【图二】的现象,我们来利用这个误差,即将这个误差扩散到该像素点的周围,而不是由该像素完全承担这个误差。这样从视觉方面来看,就会更平缓,更容易接受。我们按照3:2:3的比例将8这个误差分批到该像素点的右边,右下,下边这些周围的像素点上,即右边像素=右边像素+3,右下像素=右下像素+2,下边像素=下边像素+3,如此一来,处理完整个图像的每个像素点,是不是比直接截尾的效果要好很多呢?

在上述说明中这个误差8的举例有点特殊,误差是13,则按3:2:3得分配的误差为2,1,2(或者四舍五入的3,2,3)。

事实上,3:2:3的效果也不是最好的分配误差法案,你还可以试一试下面的分法(也可以自己构造):

其中X指的是要转换的像素点,周围的瓜分误差的比例。

ok,这个算法还是比较有用的,由于比较简单,就不给出代码了,可以自己实现一下。
————————————————
版权声明:本文为CSDN博主「hujingshuang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hujingshuang/article/details/45716445

发布了49 篇原创文章 · 获赞 138 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/lz0499/article/details/101623126