张志华,侯恩科,马 露
(1.兰州交通大学 数理与软件工程学院,甘肃 兰州 730070;2.西安科技大学 地质与环境学院,陕西 西安 710054;3.中国煤炭地质总局航测遥感局 遥感应用研究院,陕西 西安 710054)
富有颜色的图形图像是人类最容易接受的信息,具有文字不可比拟的优点。自从美国国家科学基金会在1987年提出科学计算可视化(VISC)以来,科学技术研究中的数据场的可视化问题越来越受到人们的重视[1-2]。数据场可视化中的一个关键问题,是如何运用不同的颜色来表达和区分不同的数据源。选择好的渐变颜色,能够高效地表达可见的和不可见的数据场,有利于人的视觉系统的分辨和识别。目前,国内外开发了很多应用于不同领域的VISC软件系统,在这些系统中,海量数据采用渐变伪彩色进行表达。这种表达方法,对于流体力学、生物学、考古学、地质勘探、气象学以及地理信息系统等领域的数据场表达,具有很好的直观性,增强了图像的可视性。
为了高效地对地质模型数据场进行表达,本文研究了基于OpenGL表达的颜色渲染算法,并将这些算法运用在TIN模型以及矿山巷道三维模型的显示中。这些成功的运用表明,这些算法是可行的和有效的。
颜色是可见光的一种视觉特性。从客观上讲,可见光本身并没有颜色,但是可见光不同的光谱分布会刺激人眼产生颜色的感觉,因此,颜色是一种主观评判概念。在图像处理中,运用颜色主要受两个因素推动,一是颜色作为一个强有力的描绘因子,常可简化目标物的区分及从场景中抽取目标;二是根据Grassman定律及实践证明,人的视觉系统大致可以分辨35万种彩色颜色色调和亮度,却只能辨别几十种灰度层次[3]。所以,常常在图像处理中,对于特定的单一亮度或亮度范围赋予一种或多种彩色,使人眼更能有效地分辨不同属性的数据。为了显示数据的连续性、非突变性,常采用伪彩色渐变的方式赋予数据多种彩色。
彩色系统(也称彩色模型或彩色空间)的用途,是在某些标准下,用通常可以接受的方式简化彩色规范。本质上,彩色模型是坐标系统和子空间的规范。在计算机图形学和数字图像处理学中,有两种重要的原色混合系统,即红、绿、蓝(RGB)加色系统和青、品红、黄(CMY)减色系统。这两种系统中的颜色互为补色,即青色是红色的补色,品红是绿色的补色,黄色是蓝色的补色。但遗憾的是,RGB、CMY和其他类似的彩色模型,不能很好地符合人们描述和解释颜色的方式,它们没有涉及用组成其颜色的每一原色的百分比给出物体的颜色。而HSI(色调Hue、饱和度Saturation和强度intensity)模型可在彩色图像中,从携带的彩色信息(色调和饱和度)里消去强度分量,从而成为开发基于彩色描述图像处理方法的理想工具,而且,这种彩色描述对人来说,是自然的、直观的。文献[4]中已经详细地描述了从RGB模型到HSV模型的相互变换。计算机图形图像处理中还有许多不同定义的彩色系统[3],各种颜色模型之间可以相互转换。因此,本文只在RGB彩色系统下,分析相应彩色空间的渐变算法。
OpenGL中,颜色系统所采用的模式为RGB模式。在该模式下,每一颜色分量都是从0~255。为了检索和存储的方便[5],还是把这些整数换算成0.0~1.0之间的浮点数,即i/255,i为该整数。实际场景中光照的颜色是:环境光(ambient)、散射光(diffuse)、镜面光(specular)。光只是颜色方程式的一部分。在现实世界中,物体具有它们自己的颜色,这主要是由材料属性决定的,包括:材质泛光、材质漫反射光、材质镜面反射光和材质发射光。所以,在现实世界中,人眼所看到的物体的颜色,是由实际场景光照和材质的发射光、漫反射光等相互作用而成的[6,7]。
在OpenGL中,图元的每个顶点将分配一个RGB颜色值,它是根据环境、散射和镜面光乘以材料属性的环境、散射和镜面反射率所产生的纯效果决定的。由于各个顶点间使用了渐变着色模式,因此能够实现照明和真实感的视觉。当指定了场景中的光照设置与材料的属性设置后,最终混合的颜色RGB值也就被计算出来了。
(1)
式中,materiala、materiald、materials、lighta、lightd、lights分别表示材质和光源的环境反射光、漫反射光以及镜面反射光颜色成分;Ia、Id、Is分别表示基于光照模型的环境反射光、漫反射光以及镜面反射光的光强;scenea表示全局环境光强;materiale表示材质发射光成分。
用于数据场表示的颜色渐变问题,需要考虑的关键问题有:一是如何选择合适的颜色;二是从一种颜色渐变成为另外一种颜色的插值方法[8],设最大高程值所对应的颜色为MAX(经过光照和材质属性设置后的RGB强度),最小高程值所对应的颜色为MIN,为此,首先将MAX与MIN在RGB空间分解为红、绿、蓝分量,分别设为max_r、min_r、max_g、min_g、max_b和min_b,这些分量的取值范围为[1.0, 1.0, 1.0]。设某一高程值的渐变颜色H的红、绿、蓝分量分别为Hr、Hg、Hb。将最大高程值与最小高程值之差归一化为1,则H处的值为P∈[0,1],可见P为浮点数,其中
(2)
(1)线性插值法(Linear interpolation),各个红绿蓝分量的计算公式为:
(3)
(2)线性倒插法(Reverse linear interpolation)
(4)
其中
(5)
(3)余弦插值法(Cosine interpolation)
(6)
以线性插值法为例,在OpenGL中的颜色渲染算法步骤:
Step1:数据读入;
Step2:查找出最大z值与最小z值,即max_z,min_z;
Step3:如果max_z==min_z,那么,颜色是一样的,否则有:
(7)
当Hz=min_z,有:glColor4f(min_r,min_g,min_b,1.0f);
当Hz=max_z,有:glColor4f(max_r,max_g,max_b,1.0f);
当min_z 即glColor4f(Hr,Hg,Hb,1.0f)。 以线性插值法为例,数据场颜色渲染流程如图1所示。 通过动态获取数据点的高程值,可以灵活地设置各数据点高程值的颜色RGB值,也可以动态调整RGB分量,从而得到模型所要表达的内容。例如,将高程值大的数据点所对应的RGB分量全部调大,也可以只调大其RGB中的任意分量;相反,将高程值小的数据点所对应的RGB分量全部调小,也可以只调小其RGB中的任意分量,从而拉大颜色区间,使得颜色渲染效果更好。也就解决了如何运用不同的颜色来表达和区分不同的数据源。当然,也可以将RGB模式转换成HIS模式。 图1 颜色渐变算法流程图 为了验证上面算法理论的正确性,使用MS Visual C++结合OpenGL进行编程,对3D地物进行颜色渲染。图2是光源系统和材质的动态设置,其中包括环境光、漫反射光、光源的位置、光强度、材质泛光等的动态设置,通过图2的动态设置,可以动态地调整数据场的光照渲染。图3是最大高程数据点和最小高程数据点的颜色设置,通过动态获取RGB值,选择颜色插值方法,就可以动态地调整地物的颜色渲染效果。 图4为某地区地面TIN模型,图5是该TIN所对应的面模型,根据高程值的大小,设置离散点材质的不同颜色,再通过光照模型的渲染即可。图5中,黄色表示该地区高程值较大(图形经过旋转)。图6是一巷道体模型,可以看出,根据高程值进行了颜色渲染。图7是某矿区三维巷道网络模型,根据高程值进行了颜色渲染。 图2 光源与材质颜色设置 图3 数据点颜色获取 图4 颜色线性插值法下的TIN 图5 颜色线性插值法下的TIN面模型 图6 颜色线性插值法下的巷道模型 图7 颜色线性插值法下的巷道网络模型 本文使用MS Visual C++结合OpenGL进行编程,对3D模型进行颜色渲染。结果表明,该方法可以很好地表达数据场中的模型,即本文的颜色动态渲染算法是可行的,为开发相应的三维建模软件提供借鉴。 [1] Liu,Zhong-wei. Color image retrieval using local accumulative histogram[J]. Journal of image and graphics, 1998, 3(7): 533-537. [2] 张师帅, 罗军, 朱茂殊, 等. 三维温度场计算机可视化系统的研制与开发[J]. 热能动力工程, 1999, 14(84): 441-442. [3] Huang, J. Image indexing using color correlograms. In: Proceedings of the IEEE Computer Society Conference on Computer Vision and Pattern Recognition[C]. San Juan:IEEE Computer Society, 1997: 762-768. [4] 周建龙, 肖春. 计算机图形学理论与OpenGL编程实践[M]. 广州: 华南理工大学出版社, 2007. [5] 王涛, 胡事民, 孙家广. 基于颜色-空间特征的图像检索[J]. 软件学报, 2002, 13(10): 2031-2036. [6] 白建军, 等. OpenGL三维图形设计与制作[M]. 北京: 人民邮电出版社, 1999. [7] Richard S. Wright, Benjamin Lipchak, 徐波(译). OpenGL超级宝典[M]. 北京: 人民邮电出版社,2004. [8] 李宋, 吴文权, 詹咏. 颜色渐变的算法研究[J]. 上海理工大学学报, 2004, 26(3): 224-228.5 结论