基于GDAL库的遥感图像处理软件的框架设计与开发

  • 格式:doc
  • 大小:1.57 MB
  • 文档页数:7

基于GDAL库及OpenGL的遥感图像处理类软件的框架设计方法研究王顺志(中国海洋大学信息科学与工程学院,山东青岛266100)摘要:本文介绍了GDAL库及OpenGL图形接口的功能及特点,以及这两者对于开发遥感软件的帮助和优势,在此基础上介绍了一种遥感图像处理软件框架的设计方法,使软件实现正确读取各类格式的遥感文件,进行图像处理操作并在窗口中绘图显示结果,为这类遥感软件的开发提供参考。

关键词:GDAL OpenGL 分块读取应用程序框架类对象关系1引言卫星遥感技术自上世纪八十年代起进入了一个高速发展的阶段,随着美国宇航局(NASA)、欧空局(ESA)以及其他一些国家,如加拿大、日本、中国先后建立起各自的遥感系统,为科研人员提供了越来越多有价值的从太空观测地球的数据和图像,因此,如何快捷、准确地处理遥感数据成为卫星遥感一个新的课题。

计算机软硬件技术的发展和提高为遥感数字图像处理提供了重要的技术手段,由于遥感图像比普通数字图像包含更多的信息,如目标物的大小、形状、特征属性,区分各种目标并进行分类等,这就要求将遥感图像信息的获取发展为计算机支持下的遥感图像智能化识别,最终实现遥感图像理解。

随着遥感技术在社会的许多领域发挥越来越重要的作用,研究人员对功能强大、使用方便的遥感数据处理软件的需求也在日益增长。

如今,国际上最流行的遥感软件有加拿大 PCI公司开发的PCI Geomatica、美国 ERDAS LLC公司开发的ERDAS Imagine以及美国 Research System INC公司开发的ENVI,这些遥感软件虽然功能强大,可以通过简单的菜单操作就可以得到较为理想的结果输出,但却不能记录处理过程,然而很多从事遥感行业的研究员都希望将自己的成果在以论文形式发表的同时也可以以系统和软件的形式得到实际的应用,并为以后新的理论建立一个可扩展的开发平台。

这就要求我们自己动手开发一套满足各自需求且实用的遥感软件。

此类软件的开发有以下难点:遥感数据格式多样,读取方法难统一;遥感图像容量很大,全图读取或显示十分耗时;各种遥感地理、投影信息的读取;经过复杂图像处理算法后显示输出效率低等。

本文介绍一种在Visual C++平台上基于GDAL库,并利用OpenGL图形接口的遥感图像处理类软件的框架设计方法,在此框架的基础上能够扩展出研发人员自己的各种遥感数据处理算法或功能模块,最终形成产品化的软件。

2GDAL库的功能及应用任何图像处理软件的首要工作是能够正确读取数据,遥感图像处理软件也不例外。

遥感数据是指太阳辐射、红外、微波等电磁波经过大气层到达地面,被地物反射后再次经过大气层,被遥感传感器接受,并由传感器将这部分能量特征传送回地面的能量特征数据。

由于卫星搭载的传感器多种多样,接受数据选择的波段(或者说通道)各不相同,因此传回来的遥感数据格式也是种类繁多,这就给遥感软件读取数据模块的开发带来了不小的难度,然而GDAL库却能轻松解决这一难题。

GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。

它利用抽象数据模型来表达所支持的各种文件格式。

它还有一系列命令行工具来进行遥感数据转换和处理。

有很多著名的GIS类产品都使用了GDAL/OGR库,包括ESRI 的ArcGIS 9.2,Google Earth和跨平台的GRASS GIS系统。

GDAL库几乎支持现在所有的遥感数据格式,下表列出了几种常见格式(详细的格式支持见/formats_list.html):GDAL将每个遥感数据文件视为一个数据集(Dataset),一个数据集中包含该遥感数据的全部波段(Band),这好比一个JPEG格式文件包含RGB三种颜色的数据。

读取遥感数据的操作其实就是打开数据集,获取遥感图像相关的坐标系投影信息,数据储存格式,栅格数据大小,波段数等信息,并将某一个或全部波段数据读入内存。

这里用到了GDAL库中相当重要的一个类:GDALDataset类。

首先,利用GDALAllRegister函数注册驱动,使其支持GDAL可读的全部遥感数据格式,再用GDALOpen(const char * pszFilename,GDALAccess eAccess)打开一个遥感数据集,这时就可以利用GDALDataset类中的成员函数获得波段数(GetRasterCount),图像长宽(GetRasterXSize,GetRasterYSize),投影信息(GetProjectionRef),图像仿射变换信息(GetGeoTransForm(double adf [6])),接下来建立一个GDALRasterBand类的实例,通过GetRasterBand(int n)取得数据集的第n个波段信息及数据,这使我们可以将之后的各种数据处理工作准确地定位在某个波段上,对于波段,我们可以获取波段数据类型(GetRasterDataType),数据可能的最大、最小值(GetMax\Minimum),色彩类型(GetColorInterpretation)等。

最后一步是将波段数据读入内存缓冲区,这里用到GDALRasterBand类中一个功能强大的成员函数:RasterIO。

该函数参数如下:GDALRWFlag eRWFlag, 读写标记int nXOff, int nYOff,相对于图像左上角顶点(从零开始)的行列偏移量int nXSize, int nYSize,要读写的块在x方向的象素个数和y方向的象素列数void * pData,指向目标缓冲区的指针,由用户分配int nBufXSize, int nBufYSize,目标块在x方向上和y方向上的大小GDALDataType eBufType, 目标缓冲区的数据类型,原类型会自动转换为目标类型int nPixelSpace,x方向上两个相邻象素之间的字节偏移,默认为0,则列间的实际,字节偏移由目标数据类型eBufType确定int nLineSpace, y方向上相邻两行之间的字节偏移, 默认为0,则行间的实际字节,偏移为eBufType * nBufXSize利用nXOff,nYOff,nXSize,nYSize我们可以决定读取全部波段数据,或是对大容量波段数据进行分块读取,需要注意的一点是,当我们要从高位数格式向低位数格式转化时(如UInt16向Byte转化),RasterIO将截断数据(若转为Byte类,大于255的将变为255),此为,我们可以利用nBufXSize和nBufYSize控制图像缩放,制作图像的金字塔影像结构,提高读写效率。

至此,完成整个遥感数据的读取过程。

此外,处理遥感图像除了要绘制图像,更重要的是画出目标物的地理信息,这也是遥感数据和普通数据的区别——带有空间信息。

空间信息包括两个部分:坐标系统和栅格/地理坐标系之间的转换。

遥感数据集的坐标系统是由OpenGIS WKT字符串定义,坐标转换可根据仿射地理参考或GCPs地理参考(通常一个数据集会包含其中一种或两种都没有,两种都有比较少见)进行转换。

GDAL利用OGRSpatialReference和OGRCoordinateTransformation 类描绘坐标系统(投影和基准面等)以及坐标系统之间的转换。

坐标系统一般分为地理坐标和投影坐标,OGRSpatialReference类可以便捷地定义地理或投影坐标系统,查询地理信息参数,而OGRCoordinateTransformation类服务的实现是建立在PROJ4库之上,首先利用OGRCreateCoordinateTransformation建立转化对象,再使用Transform函数进行不同坐标系之间的转化,以实现目标物的地理定位。

3OpenGL的图像处理及显示优势图形接口是图像处理软件的一个重要组成,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。

我们以Visual C++作为开发平台,使用最普遍的应该是GDI图形接口了,它通过创建设备环境(DC),可以直接向指定的设备进行输出。

GDI虽然简单易用,但对于专业图像处理软件来说,它的性能就显得相形见绌了。

OpenGL是近几年发展起来的一个性能卓越的三维图形标准,它是在SGI等多家世界闻名的计算机公司的倡导下,以SGI的GL三维图形库为基础制定的一个通用共享的开放式三维图形标准。

OpenGL可以与Visual C++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性,并有很好的可移植性。

对于开发遥感图像处理软件,我们将用到一下功能:(1)颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引(Color Index);(2)位图显示和图象增强图象功能,除了基本的拷贝和像素读写外,还提供融合(Blending)、反走样(Antialiasing)和雾(fog)的特殊图象效果处理。

以上三条可使图像更具真实感,增强图形显示的效果;(3)变换:OpenGL图形库的变换包括基本变换和投影变换。

基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。

其变换方法有利于减少算法的运行时间,提高图形的显示速度;(4)双缓存动画(Double Buffering):双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。

这是相对于GDI绘图的一个明显优势,它可以消除图像处理后窗口重绘时产生的闪烁,并且由于是先在内存缓冲区绘图,提高了图像显示速度,优化显示效果。

(5)纹理贴图:OpenGL可以将栅格数组保存为纹理对象,以贴图的方式将图像“贴”在指定的区域表面上,这对做遥感图像几何粗校正提供了很大的方便。

比如在绘制的地图或经纬度坐标系上做地理定位时,可根据图像矩形四个顶点的经纬度坐标先绘制一个矩形框,再将遥感图像“贴”到矩形框上,实现图像的旋转,由此避免了复杂的数据元阵列转化过程。

图1、2 利用OpenGL的纹理处理制作的几何校正如果说GDI是位图级的图形接口,那OpenGL则是向量级,由于遥感数据的格式多种多样,数据元的最大最小值可能差距好几个数量级,在进行灰度显示时,GDI通过将数据转换为BYTE型,设置颜色表为256级灰度,而OpenGL则可以将数据转换为FLOAT型显示,以下是分别采用以上两种方法对同一幅遥感进行灰度显示的对比,可以看出OpenGL能表现出更细致的图像细节。

图1 GDI显示效果图2 OpenGL显示效果此外,OpenGL的视口和剪裁区域是建立在笛卡尔坐标系基础上的,这为开发地理经纬度坐标映射模块提供了便捷。