0:00:00.000,0:00:04.950 在本节,我想讲一下计算机里是怎么处理数码图像的 0:00:04.950,0:00:10.218 这里有个例子 - 黄色花朵的图像 0:00:10.218,0:00:15.359 我们看到的是有机的圆形物体 0:00:15.359,0:00:20.187 在计算机里,它就成了多个小数值。这是怎样做到的呢 0:00:20.187,0:00:24.868 我们来看看左上角的这朵花 0:00:24.868,0:00:29.914 你看到一小片绿色区域,中间有个小东西 0:00:29.914,0:00:34.960 如果将它放大十倍,就成这样。你看到的图像 0:00:34.960,0:00:39.910 是由这些小正方形组成的,它们称为像素 0:00:39.910,0:00:45.325 每个像素都是正方形的,像素非常小 0:00:45.325,0:00:50.717 大概每英寸有100像素。每个像素只显示一个单色 0:00:50.717,0:00:55.815 像素是由每个单色的方块锁定 0:00:55.815,0:01:00.660 有趣的是像素看起来有点不自然,且轮廓分明 0:01:00.660,0:01:04.985 但由于像素非常小,你在原图看像素时,没有觉得不对劲 0:01:04.985,0:01:09.656 像素太小了,肉眼分辨不出来 0:01:09.656,0:01:14.154 你看不到那些分明的轮廓。放大看像素时,图像就是这样子 0:01:14.154,0:01:19.095 要考虑一个图像里有多少个像素的话,就是乘法的问题 0:01:19.095,0:01:23.863 要计算一个宽800像素和高600像素的图像有多少像素,就用乘法 0:01:23.863,0:01:28.401 将两者相乘,就是480000像素 0:01:28.401,0:01:33.191 你可能听过“百万像素”这个词 0:01:33.191,0:01:37.320 它在计算机和数码相机等很常见。百万像素就是一百万个像素 0:01:37.320,0:01:41.450 800x600的图像,480000。粗略讲,大约是一百万像素的一半 0:01:41.450,0:01:45.591 从现代标准来看,这个图像像素并不高 0:01:45.591,0:01:49.897 目前的数码相机甚至是手机 0:01:49.897,0:01:54.039 都会产生五百万像素、一千万像素或两千万像素的图像 0:01:54.039,0:01:58.970 好,我们来看看其中的原理 0:01:58.970,0:02:04.222 为了让图像轮廓分明,我做了这幅图 0:02:04.222,0:02:09.359 我可以将这个图像看做是像素组成的网格,每个像素都是一个正方形,显示一个单色 0:02:09.359,0:02:13.970 我们要有一个地址分析方案 0:02:13.970,0:02:18.932 来将每个像素与其他像素分辨出来 0:02:18.932,0:02:23.717 原理就是这里有一系列 x 值。0在最左端,往右的值不断增大 0:02:23.717,0:02:28.325 y 的方向有点特别 0:02:28.325,0:02:33.051 0在最顶端,最上面一行,y 值的顺序是从上往下 0:02:33.051,0:02:38.390 我们在计算机里就是这样使用数值的 0:02:38.390,0:02:43.922 我来做一些很简单的实例。如左上角的像素是00 0:02:43.922,0:02:48.412 或可以说 x 等于0,y 等于0 0:02:48.412,0:02:52.637 像素1在它右面,因此这个像素的位置是 x 等于0,y 等于0。 0:02:52.637,0:02:57.074 在讲到坐标时,通常是先说 x 值再说 y 值 0:02:57.074,0:03:01.787 这里就是 1, 0。这个像素可以说是 x = 4,y=2. 0:03:01.787,0:03:06.206 或者只说4,2 0:03:06.206,0:03:10.867 实际上,我们不会太纠结于用 x 和 y 的值来确定像素 0:03:10.867,0:03:15.710 你只需知道有这样一个网格就可以了 0:03:15.710,0:03:20.431 哪怕是一千万像素,每个特定的像素都有 x 值和 y 值来区别它和其他像素 0:03:20.431,0:03:25.316 问题是,有了这些像素 0:03:25.316,0:03:30.470 如何编译每个特定像素的颜色 0:03:30.470,0:03:35.392 要讲这一点,我要先讲讲简单的历史背景 0:03:35.392,0:03:40.470 在17世纪,牛顿做了一个有名的实验,我在这里复制这个实验 0:03:40.470,0:03:45.547 用棱镜,其实就是三角形的玻璃 0:03:45.547,0:03:49.354 白色阳光从左边照进来,棱镜将阳光分散成光谱 0:03:49.492,0:03:54.262 我将光谱投映在白纸上 0:03:54.262,0:03:58.703 这里显示出白光不是不可见的纯净物体。相反,它可以被分散成这些纯组成色 0:03:58.703,0:04:03.329 你看彩虹时,也是看到同样的事物 0:04:03.329,0:04:08.264 这些颜色其实是在连续谱里 0:04:08.264,0:04:13.075 不过牛顿分辨出这些颜色,并给它们命名 0:04:13.075,0:04:17.702 那个有名的顺序是从这边的红色开始,到橙色、黄色、绿色 0:04:17.702,0:04:22.390 最后是蓝色、靛青和最远处的紫色 0:04:23.505,0:04:31.051 在计算机里,我要把这些纯色看做是一个调色板 0:04:31.051,0:04:37.706 我们要使用的方案就是在这里挑出红绿蓝 0:04:37.706,0:04:43.578 将这些颜色作为组成色来构成我们想要的其他颜色 0:04:43.578,0:04:48.068 你可以这样想,左边有白光进来 0:04:48.068,0:04:52.003 这里有组成色出去 0:04:52.003,0:04:56.036 你也可以从相反的角度来想。假如我拿组成色从这边照进去 0:04:56.036,0:05:00.020 我就可以有白光出来。物理学跟这个不尽相同 0:05:00.020,0:05:04.102 但也可以提示我们如何在计算机里结合这些组成色 0:05:04.102,0:05:08.784 关于靛青有个有趣的故事 0:05:08.784,0:05:13.414 牛顿命名这些颜色时,蓝色和紫色之间我们有靛青 0:05:13.414,0:05:17.694 真的吗?我们要单独用一个词,不能就叫蓝色 0:05:17.694,0:05:22.062 这个故事之所以有意思 0:05:22.062,0:05:26.742 是它反映了17世纪的情况。牛顿信仰我们认为不科学的神秘论 0:05:26.898,0:05:31.111 那时已知的星球有七个 0:05:31.111,0:05:35.323 牛顿认为颜色的数量应该跟星球的数量一致 0:05:35.323,0:05:39.587 于是他就硬加上靛青,凑个数 0:05:39.587,0:05:44.871 好的,我要弄一个方案 0:05:44.871,0:05:50.957 将特定的颜色编译成一个叫 RGB 的颜色方案。RGB 代表红绿蓝 0:05:50.957,0:05:56.360 其中的原理,或者问题在于我要有一种方式 0:05:56.360,0:06:01.907 来编译网格里每一种颜色是什么 0:06:01.907,0:06:06.652 在 RGB 方案里,要用纯红光、纯绿光和纯蓝光 0:06:06.652,0:06:12.133 用不同的组合来混合这些颜色,使之能形成不同种类的颜色 0:06:12.133,0:06:17.614 我就不细讲这一点,这里有一个很好的示范 0:06:17.614,0:06:21.934 我要登录 RGB Explorer 这个网页,这样我就可以做示范 0:06:21.934,0:06:26.128 在左边,有三个滑动条 0:06:26.128,0:06:30.530 这一个控制红光,我们要给它们赋值 0:06:30.530,0:06:34.868 当红光滑动条移到全黑时,值为0 0:06:34.868,0:06:39.481 调高最高时,值为255。 0:06:39.481,0:06:43.820 在滑动条的下端,你可以看到滑动条上颜色的值。 0:06:43.820,0:06:48.378 这里有红色滑动条、产生绿光的绿色滑动条和产生蓝光的蓝色滑动条 0:06:48.378,0:06:52.829 RGB 方案使用的策略是 0:06:52.829,0:06:58.211 用三个按钮来改变红光、绿光和蓝光的亮度 0:06:58.211,0:07:03.656 这样,你就可以通过结合红、绿、蓝的恰当比例来产生任何颜色 0:07:03.656,0:07:07.916 很明显,如果我要产生红色,就调到最高 0:07:07.916,0:07:11.700 同样,如果要产生绿色,将绿色调到最高 0:07:11.700,0:07:15.872 掉到最高时,颜色非常亮 0:07:15.872,0:07:19.559 要深绿色的话,可以先调到绿色 0:07:19.559,0:07:23.537 再往回调,就是深绿色 0:07:23.537,0:07:27.612 在左边,数字0代表的是黑色 0:07:27.612,0:07:31.542 产生绿色时,往黑色那边调,就是深绿色。 0:07:31.542,0:07:35.666 如果要产生白色 0:07:35.666,0:07:40.159 我将红色调到最高 0:07:40.159,0:07:46.073 也把绿色和蓝色调到最高,就是白色了。所有值都是255,就是白色 0:07:46.073,0:07:51.621 将全部颜色都调到最低,全部都是0,就是黑色 0:07:51.621,0:07:56.406 我来展示一些颜色组合 0:07:56.406,0:08:01.058 我想最有趣的是红色加绿色。如果我将红色调到最高 0:08:01.058,0:08:05.955 将绿色也调到最高,就得到黄色 0:08:05.955,0:08:10.729 要黄色暗一点的话 0:08:10.729,0:08:15.320 将红色和绿色都往回调一点,往黑色那边调一点,就有暗黄色 0:08:15.320,0:08:20.156 如果继续,黄色就更暗了 0:08:20.339,0:08:24.628 要产生橙色的话,我想橙色有点像黄色 0:08:24.628,0:08:28.440 但不是红色和绿色的比例都差不多 0:08:28.440,0:08:32.653 红色要多一点,这里是红色和绿色 0:08:32.653,0:08:36.515 将红色多调一点,将绿色调少一点,就是橙色了 0:08:36.515,0:08:41.414 有点像锥形路边警告筒的样子,好看的橙色 0:08:41.414,0:08:46.380 这只是让你大致了解一下如果通过调整来产生许多好玩的颜色 0:08:46.569,0:08:51.409 我还想再试一下 0:08:51.409,0:08:56.501 是的,产生了浅绿色 0:08:56.501,0:09:01.387 我来给你看看如何产生淡黄色,这里红色和绿色都调到最高 0:09:01.387,0:09:05.850 就产生了很亮的黄色 0:09:05.850,0:09:10.254 淡黄色是比较分散、朦胧的颜色 0:09:10.254,0:09:15.011 产生淡黄色的作法是添加蓝色,我将蓝色调到180,185 0:09:15.011,0:09:19.416 如你所见,这还是黄色,不过是淡黄色,有点朦胧 0:09:19.416,0:09:24.173 我们可以这样要理解这一点 0:09:24.173,0:09:28.481 假如全部颜色都调到最大,就是白色 0:09:28.481,0:09:32.827 将蓝色调高,颜色稍稍变白,但不是纯白 0:09:32.827,0:09:37.810 红色和绿色比蓝色少一点,就是黄色 0:09:37.810,0:09:42.793 这些知识对这么课的作用是,我不要求你知道 0:09:42.793,0:09:47.486 你只要可以填三个数字产生某种颜色就行了 0:09:47.486,0:09:52.411 你明白有通过改变红、绿、蓝来产生颜色的基本方案就可以了 0:09:52.411,0:09:57.356 我还要调一个颜色给你看 0:09:57.356,0:10:01.935 我们有红、绿、黄,这很重要 0:10:01.935,0:10:07.430 我们来组成其他组合。蓝和绿可以组成蓝绿色 0:10:07.430,0:10:12.533 最后一个组合是红加蓝 0:10:12.533,0:10:17.897 红加蓝是紫,看起来确实是红和蓝的组合 0:10:17.897,0:10:23.402 好的,我们返回到我们的图像 0:10:23.402,0:10:28.505 我们知道一个概念,就是你可以将红光、绿光和蓝光混合在一起 0:10:28.505,0:10:34.444 就这个图像而言,我有其全部的像素 0:10:34.444,0:10:40.001 每一个像素都会有一种颜色 0:10:40.001,0:10:45.023 这种颜色是由红、绿、蓝的深浅决定的 0:10:45.023,0:10:50.458 或就数字而言,每个像素都有三个值。 0:10:50.458,0:10:55.825 可以说,红色是250,绿色是10,蓝色是240 0:10:55.825,0:11:01.191 我的意思是,这个像素是250、10、40 0:11:01.191,0:11:07.720 顺序是红色的值、绿色的值和蓝色的值,我在这里重新定义这张图 0:11:07.720,0:11:13.672 这里是我的像素网格,是构成图像的 0:11:13.672,0:11:19.080 有前面讲过的 x 和 y 0:11:19.080,0:11:24.908 每一个这些像素都会有自己的三个值 0:11:24.908,0:11:31.270 这个是6,2,57。6很低,绿色是250,很高,蓝色是7,很低 0:11:31.270,0:11:37.540 基本上是绿色,对吧?绿色的值很高 0:11:37.540,0:11:41.868 这个像素可能是241,252,23。红和绿的值都很高,蓝色的值很低 0:11:41.868,0:11:45.929 基本上就是黄色。 0:11:45.929,0:11:49.941 我调整滑动条时,我趋向于调到255或0 0:11:49.941,0:11:53.514 在现实世界中拍数码照片时,经常会有如237或26这样的中间值 0:11:53.514,0:11:56.890 这些数字混合起来产生某种颜色 0:11:56.890,0:12:00.951 这就是我们目前给图像下的临时定义 0:12:00.951,0:12:04.817 这里有一个像素的网格 0:12:04.817,0:12:09.495 每个像素显示一种颜色 0:12:09.495,0:12:16.125 每种颜色用三个数字来表示 0:12:16.125,0:12:23.182 回顾一下,我们从这张图像开始 0:12:23.182,0:12:27.596 我将它缩减成有多个数字组成的网格 0:12:27.596,0:12:32.067 在计算机科学里,这是一个很常见的主题 0:12:32.067,0:12:36.538 先从整个图像、整段音频或整部百科全书开始 0:12:36.538,0:12:41.178 作为人类,我们把这些事物视作一个有机的整体 0:12:41.178,0:12:46.045 在计算机里,所有数据都不可避免地有一个组织方案,将这些事物分解成多个小数字 0:12:46.045,0:12:50.629 这就是计算机的表现事物的形式 0:12:50.629,0:12:55.100 我们可以将它视作是数字运算。如果我要拍张图片,将它变亮一点 0:12:55.251,0:12:59.200 在计算机里,我们要将它转换成数字运算 0:12:59.200,0:13:03.047 例如,我要将一个图像调亮一点 0:13:03.047,0:13:07.046 啊,我们有红绿蓝的值 0:13:07.046,0:13:11.197 每个值都加10 0:13:11.197,0:13:15.095 在RGB Explorer里,我将每个值往右调,调亮一点 0:13:15.095,0:13:19.196 不管怎样,那是后面几部分的内容 0:13:19.196,0:13:23.195 在计算机里,事物是存储在多个小数值里 0:13:23.195,0:13:27.194 计算机领域就是这样 0:13:27.194,0:13:28.460 我们将会碰到很多这样的情况