图片处理中的Dithering技术
话说二战的时候,美国轰炸机每次执行任务,除了满载着威力强大的炸弹以外,还常常要装配一台计算机,飞机飞行方向和投弹的抛物线的计算都离不开这台机器。可是世界上第一台电子计算机在二战结束后才发明,轰炸机上当时携带着的“计算机”其实就是个装有一大堆齿轮的大箱子,这台笨重的箱子计算能力还远远比不上今天的手里拿着的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异常, 这个问题曾经让我觉得很烦恼,后来终于得到了解决, 那么现在就让我和大家一起分享一下吧. 这篇博文要讲的图片缓存机制,我接触到的有两 ...
随机推荐
- 【卷一】正则一 之re.split
有时候,用re.split()匹配字符串会比findall,search, match等 正则表达式对象方法方便简洁很多! 参考: <Python核心编程(3rd)>—p23 如果给定分隔 ...
- E - 小晴天老师系列——我有一个数列!
E - 小晴天老师系列——我有一个数列! Time Limit: 20000/10000MS (Java/Others) Memory Limit: 128000/64000KB (Java/O ...
- 杭电20题 Human Gene Functions
Problem Description It is well known that a human gene can be considered as a sequence, consisting o ...
- 管理MySQL的命令
USE 数据库名 :选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库. SHOW DATABASES: 列出 MySQL 数据库管理系统的数据库列表. SHOW TABLE ...
- 初试LIBSVM
在做Kinect手势识别项目的时候用到了SVM这个东西.原理上不甚了解,但是用起来感觉还是很神奇的. 度娘百科:支持向量机SVM(Support Vector Machine)作为一种可训练的机器学习 ...
- 程序开发:MVC设计模式与应用
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面 显示分离的方法组织代 ...
- HDU 4329 MAP(stringstream的用法)
这个题目有点绕,但是按着他的意思写不难模拟出来.本来是一场学弟们的训练赛,我这个学长在赛场上却WA了四次都没过,三条黑线就一直在我的脑袋上挂着... 赛后开始找原因,后来发现题目看错了,1/R中的R是 ...
- C# 处理图片 不规则图形裁剪
最近项目要求实现不规则裁剪功能.本来想用html5的canvas在前端实现的,但是发现有点困难,以下为C#端对图对片的处理. 为了让大家知道下面内容是否是自己想要的,我先发效果图. 原图 通过下面代码 ...
- IntelliJ IDEA 7.0 正式版注册机代码
好神奇,第一次看见注册机的源代码,自己运行一下.可以是java IDE环境,也可以是配置好jdk的dos环境. 然后输入自己的用户名就可以获得相对应的注册码,输入到软件中即可. 仅供参考,请购买正版. ...
- unix文件系统
转自here 我一向坚持的原则,那就是任何东西的根本性的,本质上的原理以及背后的思想都是及其简单的,所谓的复杂性都是优化与策略化的扩展带来的,正如TCP一样,UNIX的文件系统也不例外!我们必须知道, ...