基于OpenGL的多波束剖面声纳数据3D可视化

2009-8-6 作者: 沈郑燕 桑恩方 李元首 来源: 计算机工程

关键字: OpenGL技术 剖面声纳 三维可视化 纹理映射 

多波束剖面声纳接收数据的可视化一般用2D矩形图或扇形图进行显示。针对上述情况,提出一种基于OpenGL的3D数据显示方法。该方法将接收数据进行小波分解,把处理后的数据作为纹理按时间帧映射于3D坐标系中,通过设置透明度消除遮挡,从而将不同时间信息的数据融合在同一个3D场景中,以提高成像的空间感。

  1、概述

  多波束剖面声纳具有一定的穿透能力,因此,在与海洋相关的工程领域逐渐凸现出独特的优势,而对其接收数据的可视化已成为衡量剖面声纳性能的关键。目前,国外的一些研制工作处于领先水平,南安普顿大学国家海洋中心(NOC)和GeoAcoustic公司合作在原有的GeoChirpII浅地层剖面声纳的基础上开发的第1款用于商业用途的3D剖面声纳GeoChirp 3-D能够真实地体现被测区域的3D立体剖面信息。而国内对多波束剖面声纳的研制还处于起步阶段,已有的研究成果多是以一维线阵为基础,获得地层的二维剖面图像。因为二维图像包含信息少,不便于进行空间整体分析[1],所以可以考虑将时间信息拟合进来,通过多帧数据图像的拼接实现三维显示,其显示效果应类似于地形生成的三维建模。但由于声纳接收到的数据复杂多变,每帧数据中目标的位置随机出现,许多方法如网格算法不太适合这一特点及显示要求,因此本文提出用OpenGL(Open Graphics Library)纹理映射的方法,将二维数据转换为纹理映射到三维空间,从而对数据的更新历程有一个空间上的模拟,使目标形态更直观地呈现出来。

  2、基于OpenGL的数据三维显示流程

  OpenGL发展至今已推出2.0版标准,成为跨平台最广泛的三维引擎。它实质上仅仅是一个图形函数库而不是一种程序设计语言,独立于窗口系统和操作系统,包含5大类约 200多个函数。这些函数使OpenGL成为一个具有良好兼容性、扩展性、可编程性、可移植性的开发平台,支持立即模式和显示表模式,通过它可以充分利用底层硬件的特性进行可视化、交互式的图形建模。

  用OpenGL实现多波束剖面声纳数据3D可视化的主要流程如图1所示。其中,数据小波分解的主要目的是进行去噪和压缩,以便快速地定位识别。而纹理映射的应用并非出于一般真实感建模的需要,只是一种数据显示方式。纹理映射后,还要做适当的透明处理,才能得到理想的可视化效果。

  3、纹理的获取

  3.1 数据压缩及去噪

  从多波束剖面声纳的接收端接收到表示回波强度的矩形数据块。这些原始数据作为图像,一般在角度(水平)方向上需要插值,而深度(垂直)方向需要抽取,并且受到噪声污染,影响目标判决。为使数据处理快速有效,使用小波分解后的低频分量作为纹理映射的原始数据,不仅数据量大大减小,而且图像的重要细节能得以保留。但是,小波变换是线性滤波,本身算法较复杂,因此,可以结合数学形态学,使用所谓的形态小波[6-7]。形态小波是非线性变换,仅利用最大、最小、加、减运算实现多分辨率分析。形态小波在算法上简单易行,在性能上能更好地去噪和保留细节。其信号分析算子和细节分析算子为

  其中,信号分析算子也可写为取最小值的形式。这样,在具体编程进行深度方向某列数据的抽取时,可按下式实现:

  其中,a=2j是小波分解的尺度,k=0,1,…,(2j-1),可以根据实际数据量和精度进行选择。如当j=1时,将上述抽取算法应用于一幅含高斯噪声的二维图像,得到的一阶形态小波分解结果如图2所示。

  在图2中,形态小波分解后的4幅图像分别对应该尺度下的低频、水平高频、垂直高频和对角高频分量。低频图像去除了大量噪声,保留了重要细节,大小为原图像的1/4。如果进一步增大j值,低频图像中残存的噪声会更少、数据量更小,但图像细节会越来越模糊。因此,必须根据实际需要调整j值。对声纳接收数据进行适当的形态小波分解,得到的低频数据便是在不影响视觉效果和精度的前提下经过压缩(抽取)和去噪的数据。

  3.2 格式转换

  利用小波变换对原始数据所有列进行去噪和压缩后,经角度方向的适当插值便得到了用于显示的基本矩形数据块。其数据的大小体现了不同空间距离上声纳接收回波信号的强弱。但是,如果把这样的数据块作为一幅图像直接显示在三维空间中,会毫无立体感,因为这种映射过程是基于像素点的操作,像素点与屏幕上的点有对应关系,一个像素点可能表示三维场景中的多个点,所以进行写像素操作时,只会将数据显示于屏幕上,即使用glRasterPos3i函数在三维空间中定义光栅也达不到预期的效果。于是采用纹理映射,将空间距离上的回波信息表现为纹理中的不同灰度映射到三维空间。然而,为了得到相应的二维颜色纹理,需要将数据的格式进行转换。这里的格式转换主要指数据块大小的转换,在OpenGL2.0以前的版本中,并非任意数据块都可作为纹理显示,纹理数据对行数和列数都有严格的限制,必须是2的幂,如512行128列。新版的OpenGL虽然支持非二次幂纹理技术,但因为会带来一些纹理坐标贴图的差异[8],所以并未采用。如果数据大小不符合要求,可以用OpenGL中的gluScaleImage函数进行调整。该函数可以把任意大小的数据变成符合纹理要求的数据形式,至此就得到了能在三维场景中渲染的纹理。




<<首页 <上一页  1  2  3  下一页>  末页>>  
责任编辑:熊东旭