第十九章颜色的使用 MATLAB提供了许多在二维和三维空间内显示可视信息的工具。例如,看一条sin函数的 曲线图就会比一堆数据提供更多的信息。这种用图表和图形来表示数据的技术叫做数据可视化 MATLAB不仅是一个强大的计算工具,并且在以引人入胜和直观方式可视地表示数据方面也很 有特色。 但是很多时候,一个简单的二维或三维图形不能一次显示出想要提供的全部信息。这时, 颜色可以对图形提供一个附加的维数。前面章节讨论的许多绘图函数都可以接受一个可用的颜 色参量,来增加这附加的维数, 本章的讨论以研究颜色映象开始:如何使用、显示、修改和如何创建用户自己的颜色映象。 然后,阐述在一个图形窗口中仿真多个颜色映象的技术或只使用颜色映象的一部分的技术。最 后,讨论照明模型并提供例子 19.1颜色映象理解 MATLAB有一个叫颜色映象的数据结构来代表颜色值。颜色映象定义为一个有三列和若干 行的矩阵。利用0到1之间的数,矩阵的每一行都代表了一种色彩。任一行的数字都指定了 个RGB值,即红、黄、蓝三种颜色的强度,形成一种特定的颜色。一些有代表性的RGB值在 表19.1中给出 表191 简单颜色 Red(红) Green(绿)Blue(蓝)颜色 0110011021 0 0 黑白红绿蓝黄 青 天 l/2 橘 红蓝蓝黄红色 灰1 有十个 MATLAB函数产生预定的颜色映象。见表192
第十九章 颜色的使用 MATLAB 提供了许多在二维和三维空间内显示可视信息的工具。例如,看一条 sin 函数的 曲线图就会比一堆数据提供更多的信息。这种用图表和图形来表示数据的技术叫做数据可视化。 MATLAB 不仅是一个强大的计算工具,并且在以引人入胜和直观方式可视地表示数据方面也很 有特色。 但是很多时候,一个简单的二维或三维图形不能一次显示出想要提供的全部信息。这时, 颜色可以对图形提供一个附加的维数。前面章节讨论的许多绘图函数都可以接受一个可用的颜 色参量,来增加这附加的维数。 本章的讨论以研究颜色映象开始:如何使用、显示、修改和如何创建用户自己的颜色映象。 然后,阐述在一个图形窗口中仿真多个颜色映象的技术或只使用颜色映象的一部分的技术。最 后,讨论照明模型并提供例子。 19.1 颜色映象理解 MATLAB 有一个叫颜色映象的数据结构来代表颜色值。颜色映象定义为一个有三列和若干 行的矩阵。利用 0 到 1 之间的数,矩阵的每一行都代表了一种色彩。任一行的数字都指定了一 个 RGB 值,即红、黄、蓝三种颜色的强度,形成一种特定的颜色。一些有代表性的 RGB 值在 表 19.1 中给出。 表 19.1 简单颜色 Red(红) Green(绿) Blue(蓝) 颜色 0 0 0 黑 1 1 1 白 1 0 0 红 0 1 0 绿 0 0 1 蓝 1 1 0 黄 1 0 1 洋红 0 1 1 青蓝 2/3 0 1 天蓝 1 1/2 0 橘黄 .5 0 0 深红 .5 .5 .5 灰色 有十个 MATLAB 函数产生预定的颜色映象。见表 19.2
表192 标准颜色映象 hsy 色彩饱和值(以红色开始和结束) 从黑到红到黄到白 c00 青蓝和洋红的色度 粉红的彩色度 gray 线性灰度 带一点蓝色的灰度 hsv的一种变形(以蓝色开始和结束) copper 线性铜色度 prim 三棱镜。交替为红色、橘黄色、黄色、绿色和天蓝色 交替为红色、白色、蓝色和黑色 按缺省,上面所列的各个颜色映象产生一个64×3的矩阵,指定了64种颜色RGB的描述 这些函数都接受一个参量来指定所产生矩阵的行数。比如hot(m)产生一个m×3的矩阵,它包 含的RGB颜色值的范围从黑经过红、橘红和黄,到白 大多数计算机在一个8位的硬件查色表中一次可以显示256种颜色,当然有些计算机的显 示卡可以同时显示更多的颜色。这就意味着在不同的图中,一般一次可以用三或四个64×3的 颜色映象。如果使用了更多的颜色映象输入项,计算机必须经常在它的硬件査色表中调出输入 项。比如,当在画MA∏LAB图形时背景图案发生了变化,就是发生了这种情况。所以,除非 计算机有一次显示更多种颜色的显示卡,最好任何一次所用的颜色映象输入项数都小于256。 19.2颜色映象使用 语句 colormap(M)将矩阵M作为当前图形窗口所用的颜色映象。例如, colormap(cool 装入了一个有64个输入项的cool颜色映象。 colormap default装入了缺省的颜色映象(hs) 函数plot、plot3、 contour和 contour.3不使用颜色映象,它们使用列在plot颜色和线形表 中的颜色。而大多数其它绘图函数,比如mesh、surf、fi、 pcolor和它们的各种变形函数,使 用当前的颜色映象。 接受颜色参量的绘图函数中的颜色参量通常采用以下三种形式之一:(1)字符串。代表 plot颜色或线型表中的一种颜色,比如,r代表红色;(2)三个输入的行向量。它代表一个 单独的RGB值,比如.25.5075:(3)矩阵。如果颜色参量是一个矩阵,其元素作了调 整,并把它们用作当前颜色映象的下标。最后一种形式会在以后作更多讨论。 19.3颜色映象显示 可以用多种途径来显示一个颜色映象。其中一个方法是观察颜色映象矩阵的元素。 > hot(8
表 19.2 标准颜色映象 hsv 色彩饱和值(以红色开始和结束) hot 从黑到红到黄到白 cool 青蓝和洋红的色度 pink 粉红的彩色度 gray 线性灰度 bone 带一点蓝色的灰度 jet hsv 的一种变形(以蓝色开始和结束) copper 线性铜色度 prim 三棱镜。交替为红色、橘黄色、黄色、绿色和天蓝色 flag 交替为红色、白色、蓝色和黑色 按缺省,上面所列的各个颜色映象产生一个 64×3 的矩阵,指定了 64 种颜色 RGB 的描述。 这些函数都接受一个参量来指定所产生矩阵的行数。比如 hot(m)产生一个 m×3 的矩阵,它包 含的 RGB 颜色值的范围从黑经过红、橘红和黄,到白。 大多数计算机在一个 8 位的硬件查色表中一次可以显示 256 种颜色,当然有些计算机的显 示卡可以同时显示更多的颜色。这就意味着在不同的图中,一般一次可以用三或四个 64×3 的 颜色映象。如果使用了更多的颜色映象输入项,计算机必须经常在它的硬件查色表中调出输入 项。比如,当在画 MATLAB 图形时背景图案发生了变化,就是发生了这种情况。所以,除非 计算机有一次显示更多种颜色的显示卡,最好任何一次所用的颜色映象输入项数都小于 256。 19.2 颜色映象使用 语句 colormap(M)将矩阵 M 作为当前图形窗口所用的颜色映象。例如,colormap(cool) 装入了一个有 64 个输入项的 cool 颜色映象。colormap default 装入了缺省的颜色映象(hsv)。 函数 plot、plot3、contour 和 contour3 不使用颜色映象,它们使用列在 plot 颜色和线形表 中的颜色。而大多数其它绘图函数,比如 mesh、surf、fill、pcolor 和它们的各种变形函数,使 用当前的颜色映象。 接受颜色参量的绘图函数中的颜色参量通常采用以下三种形式之一:(1)字符串。代表 plot 颜色或线型表中的一种颜色,比如,’ r ‘代表红色;(2)三个输入的行向量。它代表一个 单独的 RGB 值,比如[.25 .50 .75];(3)矩阵。如果颜色参量是一个矩阵,其元素作了调 整,并把它们用作当前颜色映象的下标。最后一种形式会在以后作更多讨论。 19.3 颜色映象显示 可以用多种途径来显示一个颜色映象。其中一个方法是观察颜色映象矩阵的元素。 » hot(8)
ans 0.3333 0.6667 00000.3333 1.00000.6667 0000 100001.0000 1.00001.00000.5000 100001.000010000 上面的数据显示出第一行是1/3红色,而最后一行是白色。另外,函数 pcolor可以用来显 示一个颜色映象。例如 16 >)colormapgjet(n)) >) pcolor([l: n+1; 1: n+1) >)title( 'Using Pcolor to Display a Color Map') 输出见图19.1 Using Pcolor to Display a Color Map 16 14 10 8642 图191用伪彩色来显示颜色映象 因为上面这一段程序很有用处,它已经装入精通 MATLAB工具箱中的函数 mmshow中
ans = 0.3333 0 0 0.6667 0 0 1.0000 0 0 1.0000 0.3333 0 1.0000 0.6667 0 1.0000 1.0000 0 1.0000 1.0000 0.5000 1.0000 1.0000 1.0000 上面的数据显示出第一行是 1/3 红色,而最后一行是白色。另外,函数 pcolor 可以用来显 示一个颜色映象。例如: » n=16; » colormap(jet(n)) » pcolor([1:n+1;1:n+1]’ ) » title( ‘Using Pcolor to Display a Color Map’ ) 输出见图 19.1. 1 1.2 1.4 1.6 1.8 2 2 4 6 8 10 12 14 16 Using Pcolor to Display a Color Map 图 19.1 用伪彩色来显示颜色映象 因为上面这一段程序很有用处,它已经装入精通 MATLAB 工具箱中的函数 mmshow 中
>help mmshow MMSHOW PCOLOR Colormap Display MMSHOW(MAP)displays the colormap MAP MMSHOW(MAP(N)) displays the colormap MAP having N elements Examples: MMSHOW(hot) MMSHOW(pink (30)) 帮助信息 MMSHOW显示 PCOLOR颜色映象 MMSHOW使用 pcolor来显示当前颜色映象 MMSHOW(MAP)显示MAP颜色映象 MMSHOW(MAP(N)显示一个有N个元素的MAP颜色映象 例子: MMSHOW(hot) MMSHOW(pink (30)) 函数 mmshow取和 colormap同样的输入参量,但在这种情况下它用自己的伪彩色显示而 不是把颜色映象施加到当前图形。 另一种途径是使用 MATLAB的函数 replot,它可以把颜色映象的各列分别画成红、绿和 蓝色。例如: >)rgbplot(hot 输出见图192
» help mmshow MMSHOW PCOLOR Colormap Display MMSHOW uses pccolor to display the current colormap. MMSHOW(MAP) displays the colormap MAP. MMSHOW(MAP(N)) displays the colormap MAP having N elements. Examples:MMSHOW(hot) MMSHOW(pink(30)) 帮助信息: MMSHOW 显示 PCOLOR 颜色映象 MMSHOW 使用 pcolor 来显示当前颜色映象 MMSHOW(MAP) 显示 MAP 颜色映象 MMSHOW(MAP(N)) 显示一个有 N 个元素的 MAP 颜色映象 例子:MMSHOW(hot) MMSHOW(pink(30)) 函数 mmshow 取和 colormap 同样的输入参量,但在这种情况下它用自己的伪彩色显示而 不是把颜色映象施加到当前图形。 另一种途径是使用 MATLAB 的函数 rgbplot,它可以把颜色映象的各列分别画成红、绿和 蓝色。例如: » rgbplot(hot) 输出见图 19.2
红 绿 蓝 05 0.1 图192用红、绿和蓝色画颜色映象 图中显示红色分量首先增加,然后是绿色,最后是蓝色。 rgbplot(gray)表示所有三列数 据均匀线性地增加(三条线重叠)。 最后,函数 colorbar在当前的图形窗口中增加水平或垂直的颜色标尺以显示当前坐标轴的 颜色映象。》 colorbar( horiz)在当前的图形下面放一个水平的颜色条。》 colorbar(vert)在 当前的图形右边放一个垂直的颜色条。对无参量的 colorbar,如果当前没有颜色条就加一个垂 直的颜色条,或者更新现有的颜色条。下面的例子就演示了 colorbar的用法 >x, y, z]=peaks >)colormap(hsv) axis(-33-33-68]) 输出见图193
图 19.2 用红、绿和蓝色画颜色映象 图中显示红色分量首先增加,然后是绿色,最后是蓝色。rgbplot(gray)表示所有三列数 据均匀线性地增加(三条线重叠)。 最后,函数 colorbar 在当前的图形窗口中增加水平或垂直的颜色标尺以显示当前坐标轴的 颜色映象。» colorbar( ‘horiz’ ) 在当前的图形下面放一个水平的颜色条。» colorbar( ‘vert’ ) 在 当前的图形右边放一个垂直的颜色条。对无参量的 colorbar,如果当前没有颜色条就加一个垂 直的颜色条,或者更新现有的颜色条。下面的例子就演示了 colorbar 的用法。 » [x,y,z]=peaks; » mesh(x,y,z); » colormap(hsv) » axis([-3 3 -3 3 -6 8]) » colorbar 输出见图 19.3
420 864202 -6 图193使用颜色条 19.4颜色映象的建立和修改 颜色映象就是矩阵,意味着你可以象其它数组那样对它们进行操作。函数 brighten就利用 这一点通过调整一个给定的颜色映象来增加或减少暗色的强度。 brighten(m)(0 pinkman=squr(2/3*gray+1/3*hot) 只当所有元素都在0与1之间时,才能保证结果是一个有效的颜色映象。精通 MATLAB 工具箱中包含了一个名叫 rainbow的颜色映象,它把可视范围扩展到整个颜色映象。函数 rainbow的在线帮助为: > help rainbow
-6 -4 -2 0 2 4 6 8 -2 0 2 -2 0 2 -6 -4 -2 0 2 4 6 图 19.3 使用颜色条 19.4 颜色映象的建立和修改 颜色映象就是矩阵,意味着你可以象其它数组那样对它们进行操作。函数 brighten 就利用 这一点通过调整一个给定的颜色映象来增加或减少暗色的强度。brighten(n)(0<1<=1)使当前颜 色映象变亮;而 brighten(n)(-1<=n<0)使它变暗。brighten(n)后加一个 brighten(-n)使颜色映 象恢复原来状态。newmap=brighten(n) 命令创建一个比当前颜色映象更暗或者更亮的新的颜色 映象,而并不改变当前的颜色映象。命令» newmap=brighten(cmap,n)对指定的颜色映象创建一 个已调整过的式样,而不影响当前的颜色映象或指定的颜色映象 cmap。 可以通过生成 m×3 的矩阵 mamap 来建立用户自己的颜色映象,并用 colormap(mymap) 来安装它。颜色映象矩阵的每一个值都必须在 0 和 1 之间。如果企图用大于或小于 3 列的矩阵 或者包含着比 0 小比 1 大的任意值,函数 colormap 会提示一个错误然后退出。 也可以在算术上来组合颜色映象,虽然结果有时是不可预料的。比如,一个叫 pink 的颜色 映象仅仅是: » pinkmap=squr(2/3*gray+1/3*hot); 只当所有元素都在 0 与 1 之间时,才能保证结果是一个有效的颜色映象。精通 MATLAB 工具箱中包含了一个名叫 rainbow 的颜色映象,它把可视范围扩展到整个颜色映象。函数 rainbow 的在线帮助为: » help rainbow
RAINBOW Colormap varient to HSV RAINBOW(M) Rainbow Colormap M entries Red-Orange- Yellow- Green-Blue-Vi RAINBOW by itself is the same length as the current colormap apply 帮助信息 RAINBOW HSV颜色映象的变形 RAINBoW(M)有M个入口项的 RAINBOW颜色映象 红一橘黄一黄一绿一蓝一天蓝 RAINBOW本身和当前颜色映象的长度相同 应用: colormap( (rainbow) 精通 MATLAB工具箱中还包含了一个名叫mmap的函数,它可以根据你所提供的颜色建 立一个单色(比如粉红、灰色或铜黄色)的颜色映象。函数mmap的在线帮助是 >help mmap MMAP Single Color Colormap MMAP(C, M) makes a colormap of length M starting with the basic colorspec C. The map changes from dark to light MMAP(C) is the same length as current colormap Examples: mmap( y')is a yellow colormap map([49 ap 帮助信息 MMAP单色颜色映象 MMAP(O,M)制作一个以颜色C为基色的长度为M的颜色映象。该表的颜色从暗到明 MMAP(C)颜色映象的长度和当前颜色映象相同 例 p(y)是一个黄色颜色映象 mmap(49183]是一个水色的颜色映象 mmap(c',20)是一个长度为20的青蓝色的颜色映象 应用: colormap(mmap(c,m) 个颜色映象定义了用于绘制图形的调色板。一个缺省的颜色映象允许对数据使用64种不 同的RGB值。MA∏LAB使用函数cis来决定哪一个数据值映射到颜色映象中输入项
RAINBOW Colormap varient to HSV. RAINBOW(M) Rainbow Colormap with M entries. Red-Orange-Yellow-Green-Blue-Violet RAINBOW by itself is the same length as the current colormap. Apply using :colormap(rainbow) 帮助信息: RAINBOW HSV 颜色映象的变形 RAINBOW(M) 有 M 个入口项的 RAINBOW 颜色映象 红—橘黄—黄—绿—蓝—天蓝 RAINBOW 本身和当前颜色映象的长度相同 应用:colormap(rainbow) 精通 MATLAB 工具箱中还包含了一个名叫 mmap 的函数,它可以根据你所提供的颜色建 立一个单色(比如粉红、灰色或铜黄色)的颜色映象。函数 mmap 的在线帮助是: » help mmap MMAP Single Color Colormap. MMAP(C,M) makes a colormap of length M starting with the basic colorspec C.The map changes from dark to light. MMAP(C) is the same length as current colormap. Examples:mmap( ‘y’ ) is a yellow colormap. mmap([.49 1 .83]) is an aquamarine colormap. mmap( ‘c’ ,20) is a cyan colormap having length 20. 帮助信息: MMAP 单色颜色映象 MMAP(C,M) 制作一个以颜色 C 为基色的长度为 M 的颜色映象。该表的颜色从暗到明 变化。 MMAP(C) 颜色映象的长度和当前颜色映象相同 例子:mmap( ‘y’ )是一个黄色颜色映象 mmap([.49 1 .83])是一个水色的颜色映象 mmap( ‘c’ ,20)是一个长度为 20 的青蓝色的颜色映象 应用:colormap(mmap(c,m)) 一个颜色映象定义了用于绘制图形的调色板。一个缺省的颜色映象允许对数据使用 64 种不 同的 RGB 值。MATLAB 使用函数 cxis 来决定哪一个数据值映射到颜色映象中输入项
通常,颜色映象进行过调节,把数据从最小扩展到最大,也就是说整个颜色映象都用于绘 图。有时也许想改变颜色使用的方法。函数 caxIs代表颜色轴,因为颜色增加了另一个维数,它 允许对数据范围的一个子集使用整个颜色映象或者对数据的整个集合只使用当前颜色映象的一 部分 Icmi,cmax}= caxIs返回映射到颜色映象中第一和最后输入项的最小和最大的数据。它们通 常被设成数据的最小值和最大值。比如,函数msh( peaks)会画出函数 peaks的网格图,并把 颜色轴 caxIs设为-65466,8.0752,即Z的最小值和最大值。这些值之间的数据点,使用从颜 色映象中经插值得到的颜色 caxIs( lemin, cmax)对cmin和cmax范围区内的数据使用整个颜色映象。比cmax大的 数据点用与cmax值相关的颜色绘图,比cmin小的数据点的颜色用与cmin值相关的颜色绘图 如果cmin小于 min(data)和或cmax大于max(data),那么与cmin和减或cmax点相关的颜色将 永远用不到。也就是说,只用到和数据相关的那一部分颜色映象。》 caxIS("auto')设置cmin和 cmax的缺省值 由于下面的例子很难在书中清晰区分灰度,运行脚本M文件 mmcaxisd. m可显示所包含的 系列更多的例子。缺省的颜色范围由下例说明: >)pcolor([1: 17; 1: 17]), colormap(hsv(8)) >)title( Default Color Range) >)caxis(auto) > colorbar 输出见图194
通常,颜色映象进行过调节,把数据从最小扩展到最大,也就是说整个颜色映象都用于绘 图。有时也许想改变颜色使用的方法。函数 caxis 代表颜色轴,因为颜色增加了另一个维数,它 允许对数据范围的一个子集使用整个颜色映象或者对数据的整个集合只使用当前颜色映象的一 部分。 [cmin,cmax]=caxis 返回映射到颜色映象中第一和最后输入项的最小和最大的数据。它们通 常被设成数据的最小值和最大值。比如,函数 mesh(peaks) 会画出函数 peaks 的网格图,并把 颜色轴 caxis 设为[-6.5466,8.0752],即 Z 的最小值和最大值。这些值之间的数据点,使用从颜 色映象中经插值得到的颜色。 caxis([cmin,cmax])对 cmin 和 cmax 范围区内的数据使用整个颜色映象。比 cmax 大的 数据点用与 cmax 值相关的颜色绘图,比 cmin 小的数据点的颜色用与 cmin 值相关的颜色绘图。 如果 cmin 小于 min(data)和/或 cmax 大于 max(data),那么与 cmin 和/或 cmax 点相关的颜色将 永远用不到。也就是说,只用到和数据相关的那一部分颜色映象。» caxis( ‘auto’ )设置 cmin 和 cmax 的缺省值。 由于下面的例子很难在书中清晰区分灰度,运行脚本 M 文件 mmcaxisd.m 可显示所包含的 一系列更多的例子。缺省的颜色范围由下例说明: » pcolor([1:17;1:17]’ ),colormap(hsv(8)) » title( ‘Default Color Range’ ) » caxis( ‘auto’ ) » colorbar » caxis ans = 1 17 输出见图 19.4
Default Color Range 14 1.6 18 图194缺省的颜色范围 可见对整个数据集合,当前颜色映象使用了所有8种颜色。每种颜色有两条。如果颜色被 映射到从-3到23的数据,那么,图中只用到五种颜色。这可以通过下面的命令实现: ))title( 'Extended Color Range) >)caxis([-3, 23 extended the color rang > colorbar redraw the color scale 输出见图195
0 2 4 6 8 10 12 14 16 18 1 1.2 1.4 1.6 1.8 2 2 4 6 8 10 12 14 16 Default Color Range 图 19.4 缺省的颜色范围 可见对整个数据集合,当前颜色映象使用了所有 8 种颜色。每种颜色有两条。如果颜色被 映射到从-3 到 23 的数据,那么,图中只用到五种颜色。这可以通过下面的命令实现: » title( ‘Extended Color Range’ ) » caxis([-3,23]) % extended the color range » colorbar % redraw the color scale 输出见图 19.5
1.6 18 图195扩展的颜色范围 如果颜色映射到从5到12的值,会用到所有的颜色。但是,比5小的数据和比12大的数 据分别映射到与数据值5和12相关的颜色。这可以通过下面的命令产生: >)title( 'Restricted Color Range >)caxis([5, 12])% resstrict the color range ) colorbar redraw the color scale 输出见图196
0 5 10 15 20 1 1.2 1.4 1.6 1.8 2 2 4 6 8 10 12 14 16 Extended Color Range 图 19.5 扩展的颜色范围 如果颜色映射到从 5 到 12 的值,会用到所有的颜色。但是,比 5 小的数据和比 12 大的数 据分别映射到与数据值 5 和 12 相关的颜色。这可以通过下面的命令产生: » title( ‘Restricted Color Range’ ) » caxis([5,12]) % resstrict the color range » colorbar % redraw the color scale 输出见图 19.6