话说二战的时候,美国轰炸机每次执行任务,除了满载着威力强大的炸弹以外,还常常要装配一台计算机,飞机飞行方向和投弹的抛物线的计算都离不开这台机器。可是世界上第一台电子计算机在二战结束后才发明,轰炸机上当时携带着的“计算机”其实就是个装有一大堆齿轮的大箱子,这台笨重的箱子计算能力还远远比不上今天的手里拿着的casio计算器,用起来也就比算盘好一些吧。这些机械计算机设计者最为担心的问题是里面的一大堆齿轮零件哪天不高兴掉下来一两个,整台机器或许就玩不转了,飞机迷失航向,炸弹误扔到自己的阵地上就要出大麻烦了。在轰炸机飞来飞去的时候,不断的晃动会不会让机器失灵成了很多人心头的忧虑。可这家伙真上了飞机,人们却意外发现它们不仅没有出问题,计算的结果反而比在地面用的时候更准确,令人疑惑不解,难道这些机器对于过山车的感觉情有独钟?人们知道了机器的这个“怪毛病”之后,干脆在地面的机器里安装上了振动器,让它们一边轻轻晃,一边工作,体验一下地面飞行的感觉,它们不仅不会进入梦乡,还会工作得更好。

这些计算机究竟为什么会喜欢坐灰机而不晕呢?经过研究发现,在精度上,这些机械玩意肯定没法跟现在的电脑比,计算不可能算到小数点之后很多位,常常要四舍五入。举个例子,假设计算机在完成一个任务的时候,一个参数先后被乘了五次,这个参数的精确值是5.4,但是计算机只能用整数,5.4只好每次都被四舍五入成了5,正确的结果应该是5.4*5.4*5.4*5.4*5.4=4591.65,可是计算的结果只有5*5*5*5*5=3125,两者有不小的误差,因为每次四舍五入之后的值都比正确的值“矮了一小截”,几次误差叠加在一起就变得越来越大。机器在晃动的时候,会再额外产生一些的小误差,但并不会雪上加霜,5.4可能被晃成5.5,5.6,四舍五入就是6了,当然也可能被晃成5.3,5.2。虽然晃动的误差完全是随机的,但是5.4还是更接近于5,所以最后变成5的可能性更大,假设五次里5.4三次变成成了5,两次被化成了6,这样计算的结果是5*5*5*6*6=4500,比起3125精确了好多。当然“晃动”一定要轻微,不能太厉害,如果5.4最后变成了10就完全不靠谱了。

在这些机器里,通过加一些随机晃动的小误差,化解掉计算机四舍五入时候大的误差,这一招称为dithering(抖动)技术,是一个“以毒攻毒”的绝妙主意。

虽然机械计算机在几年后就被淘汰了,可是dithering技术却一直被沿用着,近日各种数码产品上显示的图片,视频,声音也时不时需要“抖动”一下。

很多人小时候一定玩过这样的游戏,用硬纸板制作一个小圆盘,小圆盘上交替涂上红色和黄色,然后把小圆盘中间穿上一根小支柱,让小圆盘像陀螺一样快速旋转,你会看到什么?没错,小圆盘既不是红色,也不会黄色,而是红黄两色快速“轮班”在你的眼前闪过,被“调成”了中间的橙色。

如果一段视频播放的时候可以显示的颜色有限,比如只能显示红色和黄色,不能显示橙色(当然今天一定不会有那么落后的设备了,不过几百种、几千种颜色还是可能有不够用的时候),视频画面里橙色部分只能像5.4被四舍五入成5一样,看更接近哪一个,或者被算成红色,或者被算成黄色。视频每秒钟要快速播放24张画面,眼睛反应不过来,觉着看到的是连续的图像。我们也可以加一些”抖动“,让画面的颜色红色和黄色交替出现,该显示黄色时候也闪两下红色,该显示红色的时候也闪两下黄色,每次随机的发生。如果我们想展示“深橙色”,就让画面显示红色的概率大一点,每秒平均多显示一些次,如果想展示浅橙色,就让画面显示黄色的概率大一点,以这样的方式“调色”。像小圆盘一样,这样快速变换画面的dithering就可以欺骗住你的眼睛,“无中生有”创造出画面中本来没有的深橙色、橙色、浅橙色各种额外颜色。

一段视频里可以调出新的颜色,那么一张静止的图片又怎么办呢?dithering同样可以发挥作用。首先拿黑白图片来说,这是一张正常的黑白照片,里面有黑色,有白色,也有各种深浅不同的灰色元素。

现在如果只给你两种画笔,纯黑色和纯白色,没有灰色的画笔。你还能画出这幅图的效果吗?如果只是把图片里比较浅的灰色将就着用白色表示,把图片里比较深的灰色“四舍五入”成黑色,图片就会不幸变成下面的样子:

效果惨不忍睹。

再看一下下面这张图片

貌似ok呀!里面颜色深浅可变,咋看起来不只有黑白两种颜色。可是仔细一看,里面并没有灰色的元素,和上一幅图完全一样,只有黑点和白点。

相比于第二幅图,我们在第三幅图里进行了dithering,在黑色的区域加了一些白点,在白色的区域加了一些黑点,黑点比例比较多的区域可以表示深灰色,白点比较多的区域可以表示浅灰色,我们神奇的变了个魔术,只用黑点白点就可以画出深浅变化的图片。

下面还有一张质量更好的dithering图片,中间的那一个Lena小姐图里其实只有白色和黑色,没有任何中间的颜色,不论你相不相信。

看完了黑白、灰度的照片,我们再来看一下彩色的照片

这里有六张图片,最左上角的那张图片是神马颜色的?红色和蓝色。最右下角的那张图片是神马颜色的?紫色。错了!最右下角的那一张图片也只有红色和蓝色,这六张图片里红色小方格和蓝色小方格依次变小,到最后很小的时候,红色和蓝色都会消失,相当于我们把红色和蓝色小点”勾兑“成了紫色,在动态视频里,通过不同时间点显示不同颜色,dithering可以在你的眼前变出不存在的颜色;在静态的图片里,dithering则是在不同的位置洒下密密麻麻不同颜色的小点来让你产生颜色错觉。

在下面三张图里,第一张图是正常的图片,在第二张图里,可以用的颜色数量大大减少,这只猫成了“大花脸”,图片变得模糊。在第三张图里我们用了dithering技术,虽然颜色的种类和第二张一样多,但是看起来却舒服了好多。

dithering除了可以在图像中欺骗你的眼睛以外,在声音中也可以欺骗你的耳朵。如果一段音乐每个时间点的幅度都被四舍五入处理,原来的音乐里就会掺杂进其他频率的杂音,影响效果。如果我们让各个时间点的幅度加上一点小的误差,这种四舍五入产生的杂音就会被削弱和平均化,表面上降低声音质量的方法反而让声音效果更好。

http://songshuhui.net/archives/65689#comments

http://en.wikipedia.org/wiki/Dither

图片处理中的Dithering技术的更多相关文章

  1. OpenCV图像处理中“找圆技术”的使用

    一.为什么"找圆"     圆是基本图形的一种,更为重要的是,自然情况下采集的图像,很少大量存在"圆":但凡存在的,大都是人工的,那么就必然代表特定的意义,从而 ...

  2. OpenCV图像处理中“投影技术”的使用

           本文区分"问题引出"."概念抽象"."算法实现"三个部分由表及里具体讲解OpenCV图像处理中"投影技术" ...

  3. Java异常处理中finally中的return会覆盖catch语句中的return语句

    Java异常处理中finally中的return会覆盖catch语句中的return语句和throw语句,所以Java不建议在finally中使用return语句 此外 finally中的throw语 ...

  4. PO状态为“处理中”的处理方法

    EBS中经常会出现PO提交审批后状态为“处理中”的情况,此时PO创建人无法打开,审批人也无法打开,工作流等查看也无异常,可以使用一下SQL处理再进行审批: --set serveroutput on ...

  5. 批处理中set截取字符具体解释

    set截取字符具体解释  在批处理中,set的功能有点繁杂:设置变量.显示环境变量的名及值.做算术运算.等待用户的输入.字符串截取.替换字符串,是我们经常使用的命令之中的一个. 在字符串截取方面,新手 ...

  6. Java异常处理中,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

    Java异常处理中,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 解答:会执行,在return前 ...

  7. 批处理中setlocal enabledelayedexpansion的含义

    setlocal enabledelayedexpansion       延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫扩展!       CMD在解 ...

  8. 图片_ _图片缓存之内存缓存技术LruCache,软引用

    每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...

  9. 图片缓存之内存缓存技术LruCache,软引用

    每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个问题曾经让我觉得很烦恼,后来终于得到了解决, 那么现在就让我和大家一起分享一下吧. 这篇博文要讲的图片缓存机制,我接触到的有两 ...

随机推荐

  1. G - 娜娜梦游仙境系列——梦醒

    G - 娜娜梦游仙境系列——梦醒 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) ...

  2. 关于oracle数据库(2)

    数据备份.数据删除.数据还原 连接数据库,查看scott用户下面的所有表 数据备份(数据导出)要输入导出文件路径和文件名(文件扩展名可输入也可以不输入) 导出成功后,可以在上面输入的文件路径下面看到导 ...

  3. C#中泛型默认关键字(default)详解

    我们在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:(T 是引用类型还是值类型?)对此我们将如何处理? C#代码实例: /// <summary&g ...

  4. oracle Database Link

    1 Database Link 的创建: 有两个数据库服务器A/B, 其中A的IP地址为172.20.36.245, 服务器B为本机.服务器B上的数据库实例名为ORCL,在本机上的服务监听配置上有服务 ...

  5. JS总结之二:DOM对象控制HTML

    DOM对象控制HTML 1.方法 getElementsByName( ) ——获取name getElementsByTagName( ) ——获取元素 getAttribute( ) ——获取元素 ...

  6. hdu_2089_不要62(数位DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:中文,不解释 题解:dp[i][j]表示当前第i位的前一个数为j,然后记忆化dfs,注意的 ...

  7. ntity Framework技巧系列之四 - Tip 13 – 15

    提示13. 附加一个实体的简单方式 问题: 在早先的一些提示中,我们讨论了使用Attach来加载一个处于未改变(unchanged)状态的东西到ObjectContext从而避免进行查询的开销. 如果 ...

  8. implement a system call in minix

    http://www.papervisions.com/implementing-system-call-in-minix-os/

  9. iOS使用NSMutableAttributedString

    在iOS开发中,常常会有一段文字显示不同的颜色和字体,或者给某几个文字加删除线或下划线的需求.之前在网上找了一些资料,有的是重绘UILabel的textLayer,有的是用html5实现的,都比较麻烦 ...

  10. linux中php配置

    安装nginx+php好久了,今天意外的搭建好了,分享给大家 ,以免以后多走弯路. nginx已经前面安装好了,现在就开始配置php 安装php 分为两个部分 :一部分是php源码,另外是fastcg ...