话说二战的时候,美国轰炸机每次执行任务,除了满载着威力强大的炸弹以外,还常常要装配一台计算机,飞机飞行方向和投弹的抛物线的计算都离不开这台机器。可是世界上第一台电子计算机在二战结束后才发明,轰炸机上当时携带着的“计算机”其实就是个装有一大堆齿轮的大箱子,这台笨重的箱子计算能力还远远比不上今天的手里拿着的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技术的更多相关文章
-
OpenCV图像处理中“找圆技术”的使用
一.为什么"找圆" 圆是基本图形的一种,更为重要的是,自然情况下采集的图像,很少大量存在"圆":但凡存在的,大都是人工的,那么就必然代表特定的意义,从而 ...
-
OpenCV图像处理中“投影技术”的使用
本文区分"问题引出"."概念抽象"."算法实现"三个部分由表及里具体讲解OpenCV图像处理中"投影技术" ...
-
Java异常处理中finally中的return会覆盖catch语句中的return语句
Java异常处理中finally中的return会覆盖catch语句中的return语句和throw语句,所以Java不建议在finally中使用return语句 此外 finally中的throw语 ...
-
PO状态为“处理中”的处理方法
EBS中经常会出现PO提交审批后状态为“处理中”的情况,此时PO创建人无法打开,审批人也无法打开,工作流等查看也无异常,可以使用一下SQL处理再进行审批: --set serveroutput on ...
-
批处理中set截取字符具体解释
set截取字符具体解释 在批处理中,set的功能有点繁杂:设置变量.显示环境变量的名及值.做算术运算.等待用户的输入.字符串截取.替换字符串,是我们经常使用的命令之中的一个. 在字符串截取方面,新手 ...
-
Java异常处理中,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
Java异常处理中,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 解答:会执行,在return前 ...
-
批处理中setlocal enabledelayedexpansion的含义
setlocal enabledelayedexpansion 延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫扩展! CMD在解 ...
-
图片_ _图片缓存之内存缓存技术LruCache,软引用
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
-
图片缓存之内存缓存技术LruCache,软引用
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个问题曾经让我觉得很烦恼,后来终于得到了解决, 那么现在就让我和大家一起分享一下吧. 这篇博文要讲的图片缓存机制,我接触到的有两 ...
随机推荐
-
java编程的78条黄金法则
创建和销毁对象 1.考虑用静态工厂方法(返回类的实例的静态方法)代替构造器2.遇到多个构造器参数时要考虑用构造器3.用私有构造器或者枚举类型强化Singleton属性4.通过私有构造器强化不可实例化的 ...
-
(转)Android Studio系列教程一下载与安装 背景Android Studio VS Eclipse准备下载创建HelloWorld项目
背景 相信大家对Android Studio已经不陌生了,Android Studio是Google于2013 I/O大会针对Android开发推出的新的开发工具,目前很多开源项目都已经在采用,Goo ...
-
#include <;memory>;
1 auto_ptr 2 unique_ptr 1 auto_ptr C++的auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理. 使用std::auto_ptr,要#inc ...
-
备忘:有MTU值设置不当导致的部分网站无法访问问题
如题,有时候突然weibo.com,webQQ等网站网络连接超时,怎么找也没得原因,今天管理电信的光猫,发现设置的MTU的1400,突然想起之前电脑和路由器上设置的MTU是1500,感觉可能是这个问题 ...
-
day02python基本数据类型
python基本数据类型 基本数据类型(int,bool,str) 1.基本数据数据类型: int 整数 str 字符串. 一般不存放大量的数据 bool 布尔值. 用来判断. True, Fal ...
- Python isspace() 方法检测字符串是否只由空格组成。
-
【异常记录(八)】 This operation requires IIS integrated pipeline mode.
突然提示这个Error: Server Error in '/' Application. This operation requires IIS integrated pipeline mode. ...
-
CRS
CRS是集群就绪服务(cluster ready service)的简称,主要负责集群中的资源管理以及OCR管理.为了与10gR2集群管理软件名称crs区分,这里用CRSD代替CRS.相关概念:--资 ...
-
cocos2dx - 部署到android真机上错误整理
利用Cgywin编译工具来将cocos2dx 在Android运行所需要的C++文件编译 1. ./build_native.sh(最后一把执行出错) please define NDK_ROOT i ...
-
Linux下cpu过高问题排查
原文地址:https://blog.csdn.net/chenjunan888/article/details/80447800 在服务器报cpu过高时,可使用以下命令,快速导出堆栈信息,以方便查看具 ...