1 00:00:00,000 --> 00:00:04,950 在本节,我想讲一下计算机里是怎么处理数码图像的 2 00:00:04,950 --> 00:00:10,218 这里有个例子 - 黄色花朵的图像 3 00:00:10,218 --> 00:00:15,359 我们看到的是有机的圆形物体 4 00:00:15,359 --> 00:00:20,187 在计算机里,它就成了多个小数值。这是怎样做到的呢 5 00:00:20,187 --> 00:00:24,868 我们来看看左上角的这朵花 6 00:00:24,868 --> 00:00:29,914 你看到一小片绿色区域,中间有个小东西 7 00:00:29,914 --> 00:00:34,960 如果将它放大十倍,就成这样。你看到的图像 8 00:00:34,960 --> 00:00:39,910 是由这些小正方形组成的,它们称为像素 9 00:00:39,910 --> 00:00:45,325 每个像素都是正方形的,像素非常小 10 00:00:45,325 --> 00:00:50,717 大概每英寸有100像素。每个像素只显示一个单色 11 00:00:50,717 --> 00:00:55,815 像素是由每个单色的方块锁定 12 00:00:55,815 --> 00:01:00,660 有趣的是像素看起来有点不自然,且轮廓分明 13 00:01:00,660 --> 00:01:04,985 但由于像素非常小,你在原图看像素时,没有觉得不对劲 14 00:01:04,985 --> 00:01:09,656 像素太小了,肉眼分辨不出来 15 00:01:09,656 --> 00:01:14,154 你看不到那些分明的轮廓。放大看像素时,图像就是这样子 16 00:01:14,154 --> 00:01:19,095 要考虑一个图像里有多少个像素的话,就是乘法的问题 17 00:01:19,095 --> 00:01:23,863 要计算一个宽800像素和高600像素的图像有多少像素,就用乘法 18 00:01:23,863 --> 00:01:28,401 将两者相乘,就是480000像素 19 00:01:28,401 --> 00:01:33,191 你可能听过“百万像素”这个词 20 00:01:33,191 --> 00:01:37,320 它在计算机和数码相机等很常见。百万像素就是一百万个像素 21 00:01:37,320 --> 00:01:41,450 800x600的图像,480000。粗略讲,大约是一百万像素的一半 22 00:01:41,450 --> 00:01:45,591 从现代标准来看,这个图像像素并不高 23 00:01:45,591 --> 00:01:49,897 目前的数码相机甚至是手机 24 00:01:49,897 --> 00:01:54,039 都会产生五百万像素、一千万像素或两千万像素的图像 25 00:01:54,039 --> 00:01:58,970 好,我们来看看其中的原理 26 00:01:58,970 --> 00:02:04,222 为了让图像轮廓分明,我做了这幅图 27 00:02:04,222 --> 00:02:09,359 我可以将这个图像看做是像素组成的网格,每个像素都是一个正方形,显示一个单色 28 00:02:09,359 --> 00:02:13,970 我们要有一个地址分析方案 29 00:02:13,970 --> 00:02:18,932 来将每个像素与其他像素分辨出来 30 00:02:18,932 --> 00:02:23,717 原理就是这里有一系列 x 值。0在最左端,往右的值不断增大 31 00:02:23,717 --> 00:02:28,325 y 的方向有点特别 32 00:02:28,325 --> 00:02:33,051 0在最顶端,最上面一行,y 值的顺序是从上往下 33 00:02:33,051 --> 00:02:38,390 我们在计算机里就是这样使用数值的 34 00:02:38,390 --> 00:02:43,922 我来做一些很简单的实例。如左上角的像素是00 35 00:02:43,922 --> 00:02:48,412 或可以说 x 等于0,y 等于0 36 00:02:48,412 --> 00:02:52,637 像素1在它右面,因此这个像素的位置是 x 等于0,y 等于0。 37 00:02:52,637 --> 00:02:57,074 在讲到坐标时,通常是先说 x 值再说 y 值 38 00:02:57,074 --> 00:03:01,787 这里就是 1, 0。这个像素可以说是 x = 4,y=2. 39 00:03:01,787 --> 00:03:06,206 或者只说4,2 40 00:03:06,206 --> 00:03:10,867 实际上,我们不会太纠结于用 x 和 y 的值来确定像素 41 00:03:10,867 --> 00:03:15,710 你只需知道有这样一个网格就可以了 42 00:03:15,710 --> 00:03:20,431 哪怕是一千万像素,每个特定的像素都有 x 值和 y 值来区别它和其他像素 43 00:03:20,431 --> 00:03:25,316 问题是,有了这些像素 44 00:03:25,316 --> 00:03:30,470 如何编译每个特定像素的颜色 45 00:03:30,470 --> 00:03:35,392 要讲这一点,我要先讲讲简单的历史背景 46 00:03:35,392 --> 00:03:40,470 在17世纪,牛顿做了一个有名的实验,我在这里复制这个实验 47 00:03:40,470 --> 00:03:45,547 用棱镜,其实就是三角形的玻璃 48 00:03:45,547 --> 00:03:49,354 白色阳光从左边照进来,棱镜将阳光分散成光谱 49 00:03:49,492 --> 00:03:54,262 我将光谱投映在白纸上 50 00:03:54,262 --> 00:03:58,703 这里显示出白光不是不可见的纯净物体。相反,它可以被分散成这些纯组成色 51 00:03:58,703 --> 00:04:03,329 你看彩虹时,也是看到同样的事物 52 00:04:03,329 --> 00:04:08,264 这些颜色其实是在连续谱里 53 00:04:08,264 --> 00:04:13,075 不过牛顿分辨出这些颜色,并给它们命名 54 00:04:13,075 --> 00:04:17,702 那个有名的顺序是从这边的红色开始,到橙色、黄色、绿色 55 00:04:17,702 --> 00:04:22,390 最后是蓝色、靛青和最远处的紫色 56 00:04:23,505 --> 00:04:31,051 在计算机里,我要把这些纯色看做是一个调色板 57 00:04:31,051 --> 00:04:37,706 我们要使用的方案就是在这里挑出红绿蓝 58 00:04:37,706 --> 00:04:43,578 将这些颜色作为组成色来构成我们想要的其他颜色 59 00:04:43,578 --> 00:04:48,068 你可以这样想,左边有白光进来 60 00:04:48,068 --> 00:04:52,003 这里有组成色出去 61 00:04:52,003 --> 00:04:56,036 你也可以从相反的角度来想。假如我拿组成色从这边照进去 62 00:04:56,036 --> 00:05:00,020 我就可以有白光出来。物理学跟这个不尽相同 63 00:05:00,020 --> 00:05:04,102 但也可以提示我们如何在计算机里结合这些组成色 64 00:05:04,102 --> 00:05:08,784 关于靛青有个有趣的故事 65 00:05:08,784 --> 00:05:13,414 牛顿命名这些颜色时,蓝色和紫色之间我们有靛青 66 00:05:13,414 --> 00:05:17,694 真的吗?我们要单独用一个词,不能就叫蓝色 67 00:05:17,694 --> 00:05:22,062 这个故事之所以有意思 68 00:05:22,062 --> 00:05:26,742 是它反映了17世纪的情况。牛顿信仰我们认为不科学的神秘论 69 00:05:26,898 --> 00:05:31,111 那时已知的星球有七个 70 00:05:31,111 --> 00:05:35,323 牛顿认为颜色的数量应该跟星球的数量一致 71 00:05:35,323 --> 00:05:39,587 于是他就硬加上靛青,凑个数 72 00:05:39,587 --> 00:05:44,871 好的,我要弄一个方案 73 00:05:44,871 --> 00:05:50,957 将特定的颜色编译成一个叫 RGB 的颜色方案。RGB 代表红绿蓝 74 00:05:50,957 --> 00:05:56,360 其中的原理,或者问题在于我要有一种方式 75 00:05:56,360 --> 00:06:01,907 来编译网格里每一种颜色是什么 76 00:06:01,907 --> 00:06:06,652 在 RGB 方案里,要用纯红光、纯绿光和纯蓝光 77 00:06:06,652 --> 00:06:12,133 用不同的组合来混合这些颜色,使之能形成不同种类的颜色 78 00:06:12,133 --> 00:06:17,614 我就不细讲这一点,这里有一个很好的示范 79 00:06:17,614 --> 00:06:21,934 我要登录 RGB Explorer 这个网页,这样我就可以做示范 80 00:06:21,934 --> 00:06:26,128 在左边,有三个滑动条 81 00:06:26,128 --> 00:06:30,530 这一个控制红光,我们要给它们赋值 82 00:06:30,530 --> 00:06:34,868 当红光滑动条移到全黑时,值为0 83 00:06:34,868 --> 00:06:39,481 调高最高时,值为255。 84 00:06:39,481 --> 00:06:43,820 在滑动条的下端,你可以看到滑动条上颜色的值。 85 00:06:43,820 --> 00:06:48,378 这里有红色滑动条、产生绿光的绿色滑动条和产生蓝光的蓝色滑动条 86 00:06:48,378 --> 00:06:52,829 RGB 方案使用的策略是 87 00:06:52,829 --> 00:06:58,211 用三个按钮来改变红光、绿光和蓝光的亮度 88 00:06:58,211 --> 00:07:03,656 这样,你就可以通过结合红、绿、蓝的恰当比例来产生任何颜色 89 00:07:03,656 --> 00:07:07,916 很明显,如果我要产生红色,就调到最高 90 00:07:07,916 --> 00:07:11,700 同样,如果要产生绿色,将绿色调到最高 91 00:07:11,700 --> 00:07:15,872 掉到最高时,颜色非常亮 92 00:07:15,872 --> 00:07:19,559 要深绿色的话,可以先调到绿色 93 00:07:19,559 --> 00:07:23,537 再往回调,就是深绿色 94 00:07:23,537 --> 00:07:27,612 在左边,数字0代表的是黑色 95 00:07:27,612 --> 00:07:31,542 产生绿色时,往黑色那边调,就是深绿色。 96 00:07:31,542 --> 00:07:35,666 如果要产生白色 97 00:07:35,666 --> 00:07:40,159 我将红色调到最高 98 00:07:40,159 --> 00:07:46,073 也把绿色和蓝色调到最高,就是白色了。所有值都是255,就是白色 99 00:07:46,073 --> 00:07:51,621 将全部颜色都调到最低,全部都是0,就是黑色 100 00:07:51,621 --> 00:07:56,406 我来展示一些颜色组合 101 00:07:56,406 --> 00:08:01,058 我想最有趣的是红色加绿色。如果我将红色调到最高 102 00:08:01,058 --> 00:08:05,955 将绿色也调到最高,就得到黄色 103 00:08:05,955 --> 00:08:10,729 要黄色暗一点的话 104 00:08:10,729 --> 00:08:15,320 将红色和绿色都往回调一点,往黑色那边调一点,就有暗黄色 105 00:08:15,320 --> 00:08:20,156 如果继续,黄色就更暗了 106 00:08:20,339 --> 00:08:24,628 要产生橙色的话,我想橙色有点像黄色 107 00:08:24,628 --> 00:08:28,440 但不是红色和绿色的比例都差不多 108 00:08:28,440 --> 00:08:32,653 红色要多一点,这里是红色和绿色 109 00:08:32,653 --> 00:08:36,515 将红色多调一点,将绿色调少一点,就是橙色了 110 00:08:36,515 --> 00:08:41,414 有点像锥形路边警告筒的样子,好看的橙色 111 00:08:41,414 --> 00:08:46,380 这只是让你大致了解一下如果通过调整来产生许多好玩的颜色 112 00:08:46,569 --> 00:08:51,409 我还想再试一下 113 00:08:51,409 --> 00:08:56,501 是的,产生了浅绿色 114 00:08:56,501 --> 00:09:01,387 我来给你看看如何产生淡黄色,这里红色和绿色都调到最高 115 00:09:01,387 --> 00:09:05,850 就产生了很亮的黄色 116 00:09:05,850 --> 00:09:10,254 淡黄色是比较分散、朦胧的颜色 117 00:09:10,254 --> 00:09:15,011 产生淡黄色的作法是添加蓝色,我将蓝色调到180,185 118 00:09:15,011 --> 00:09:19,416 如你所见,这还是黄色,不过是淡黄色,有点朦胧 119 00:09:19,416 --> 00:09:24,173 我们可以这样要理解这一点 120 00:09:24,173 --> 00:09:28,481 假如全部颜色都调到最大,就是白色 121 00:09:28,481 --> 00:09:32,827 将蓝色调高,颜色稍稍变白,但不是纯白 122 00:09:32,827 --> 00:09:37,810 红色和绿色比蓝色少一点,就是黄色 123 00:09:37,810 --> 00:09:42,793 这些知识对这么课的作用是,我不要求你知道 124 00:09:42,793 --> 00:09:47,486 你只要可以填三个数字产生某种颜色就行了 125 00:09:47,486 --> 00:09:52,411 你明白有通过改变红、绿、蓝来产生颜色的基本方案就可以了 126 00:09:52,411 --> 00:09:57,356 我还要调一个颜色给你看 127 00:09:57,356 --> 00:10:01,935 我们有红、绿、黄,这很重要 128 00:10:01,935 --> 00:10:07,430 我们来组成其他组合。蓝和绿可以组成蓝绿色 129 00:10:07,430 --> 00:10:12,533 最后一个组合是红加蓝 130 00:10:12,533 --> 00:10:17,897 红加蓝是紫,看起来确实是红和蓝的组合 131 00:10:17,897 --> 00:10:23,402 好的,我们返回到我们的图像 132 00:10:23,402 --> 00:10:28,505 我们知道一个概念,就是你可以将红光、绿光和蓝光混合在一起 133 00:10:28,505 --> 00:10:34,444 就这个图像而言,我有其全部的像素 134 00:10:34,444 --> 00:10:40,001 每一个像素都会有一种颜色 135 00:10:40,001 --> 00:10:45,023 这种颜色是由红、绿、蓝的深浅决定的 136 00:10:45,023 --> 00:10:50,458 或就数字而言,每个像素都有三个值。 137 00:10:50,458 --> 00:10:55,825 可以说,红色是250,绿色是10,蓝色是240 138 00:10:55,825 --> 00:11:01,191 我的意思是,这个像素是250、10、40 139 00:11:01,191 --> 00:11:07,720 顺序是红色的值、绿色的值和蓝色的值,我在这里重新定义这张图 140 00:11:07,720 --> 00:11:13,672 这里是我的像素网格,是构成图像的 141 00:11:13,672 --> 00:11:19,080 有前面讲过的 x 和 y 142 00:11:19,080 --> 00:11:24,908 每一个这些像素都会有自己的三个值 143 00:11:24,908 --> 00:11:31,270 这个是6,2,57。6很低,绿色是250,很高,蓝色是7,很低 144 00:11:31,270 --> 00:11:37,540 基本上是绿色,对吧?绿色的值很高 145 00:11:37,540 --> 00:11:41,868 这个像素可能是241,252,23。红和绿的值都很高,蓝色的值很低 146 00:11:41,868 --> 00:11:45,929 基本上就是黄色。 147 00:11:45,929 --> 00:11:49,941 我调整滑动条时,我趋向于调到255或0 148 00:11:49,941 --> 00:11:53,514 在现实世界中拍数码照片时,经常会有如237或26这样的中间值 149 00:11:53,514 --> 00:11:56,890 这些数字混合起来产生某种颜色 150 00:11:56,890 --> 00:12:00,951 这就是我们目前给图像下的临时定义 151 00:12:00,951 --> 00:12:04,817 这里有一个像素的网格 152 00:12:04,817 --> 00:12:09,495 每个像素显示一种颜色 153 00:12:09,495 --> 00:12:16,125 每种颜色用三个数字来表示 154 00:12:16,125 --> 00:12:23,182 回顾一下,我们从这张图像开始 155 00:12:23,182 --> 00:12:27,596 我将它缩减成有多个数字组成的网格 156 00:12:27,596 --> 00:12:32,067 在计算机科学里,这是一个很常见的主题 157 00:12:32,067 --> 00:12:36,538 先从整个图像、整段音频或整部百科全书开始 158 00:12:36,538 --> 00:12:41,178 作为人类,我们把这些事物视作一个有机的整体 159 00:12:41,178 --> 00:12:46,045 在计算机里,所有数据都不可避免地有一个组织方案,将这些事物分解成多个小数字 160 00:12:46,045 --> 00:12:50,629 这就是计算机的表现事物的形式 161 00:12:50,629 --> 00:12:55,100 我们可以将它视作是数字运算。如果我要拍张图片,将它变亮一点 162 00:12:55,251 --> 00:12:59,200 在计算机里,我们要将它转换成数字运算 163 00:12:59,200 --> 00:13:03,047 例如,我要将一个图像调亮一点 164 00:13:03,047 --> 00:13:07,046 啊,我们有红绿蓝的值 165 00:13:07,046 --> 00:13:11,197 每个值都加10 166 00:13:11,197 --> 00:13:15,095 在RGB Explorer里,我将每个值往右调,调亮一点 167 00:13:15,095 --> 00:13:19,196 不管怎样,那是后面几部分的内容 168 00:13:19,196 --> 00:13:23,195 在计算机里,事物是存储在多个小数值里 169 00:13:23,195 --> 00:13:27,194 计算机领域就是这样 170 00:13:27,194 --> 00:13:28,460 我们将会碰到很多这样的情况