GDAL(1.7版本)影像读取_第1页
GDAL(1.7版本)影像读取_第2页
GDAL(1.7版本)影像读取_第3页
GDAL(1.7版本)影像读取_第4页
GDAL(1.7版本)影像读取_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

gdal 图像处理图像处理 版权所有者 赵文 一 gdal 进行数据操作进行数据操作 在安装好 gdal 后 即可调用 gdal 库中的函数 需要包含的头文件 gdal priv h 1 打开数据集 打开数据集 使用 gdal 库进行数据 影像 操作的第一步就是打开一个数据集 对于 数据集 这个名词大家 可能不会太习惯 但是对于一般的格式来说 一个 数据集 就是一个文件 比如一个 TIFF 文件 就是一个以 tiff 为扩展名的文件 但是对于众多 RS 数据来说 一个数据集包含的绝对不仅仅是 一个文件 对于很多 RS 数据 他们把一张图像分成数个图像文件 然后放在一个文件夹中 用一些额外的文件来组织它们之间的关系 形成一个 数据集 有点难以理解 暂且放过 下 面我们由给定的文件路径文件名打开一个 tiff GeoTIFF 文件 任何支持的格式 打开方式都是 这样 CString strFilePath StrFilePath d rsdata 2005 234 tif GDALDataSet poDataset GDAL 数据集 GDALAllRegister poDataset GDALDataset GDALOpen strFilePath GA ReadOnly 这样我们就打开了这个文件 通过数据集 poDataset 即可调用各功能函数 如 GetRasterCount 获取图像波段数 GetRasterXSize 获取图像宽度 GetRasterYSize 获取图像高度 GetRasterBand 获取图像某一波段 GetGeoTransform double p 获取图像地理坐标信息长度为六的数组 RasterIO 对图像数据进行缩放读和写 更具体的 API 列表可以看这里 2 获取图像信息 读取图像 获取图像信息 读取图像 打开文件后 下面要做的就是获取文件的相关信息保存在相应变量中 将图像数据读入内存中 等待后续处理了 2 1 获取基本信息 因为不同格式数据所包含的相关信息有所不同 一般情况下我们需要得到图像的高 宽 波段 数 地理坐标信息 数据类型等 Gdal 库中有相应的函数实现这些功能 下面的代码实现获取 这些信息 int nBandCount poDataset GetRasterCount int nImgSizeX poDataset GetRasterXSize int nImgSizeY poDataset GetRasterYSize double adfGeoTransform 6 poDataset GetGeoTransform adfGeoTransform 如果图像不含地理坐标信息 默认返回值是 0 1 0 0 0 1 表中第四列表示了带 有地理坐标信息的数据格式 adfGeoTransform 0 是左上角像元的东坐标 adfGeoTransform 3 是左上角像元的北坐标 adfGeoTransform 1 是像元宽度 adfGeoTransform 5 是像元高度 图像其他点坐标计算公式 Xp adfGeoTransform 0 P adfGeoTransform 1 L adfGeoTransform 2 Yp adfGeoTransform 3 P adfGeoTransform 4 L adfGeoTransform 5 注 用 GetGeoTransform 并不能十分合理的表示图像地理坐标 当影像范围很大 时 这种坐标表示方法将不适用 2 2 将图像数据按照要求读入内存 图像的读写是通过 RasterIO 实现的 RasterIO 功能十分强大 它可以把图像上指定大小的矩形 象素块以缩放的形式按指定的数据类型输出或输入到用户指定大小的缓冲区中 原型 CPLErr GDALDataset RasterIO GDALRWFlag eRWFlag 读写标记如果为 GF Read 则是将影像内容写入内存 如果 为 GF Write 则是将内存中内容写入文件 int nXOff int nYOff 相对于图像左上角顶点 从零开始 的行列偏移量 int nXSize int nYSize 要读写的块在 x 方向的象素个数和 y 方向的象素列数 void pData 指向目标缓冲区的指针 由用户分配 int nBufXSize int nBufYSize 目标块在 x 方向上和 y 方向上的大小 GDALDataType eBufType 目标缓冲区的数据类型 原类型会自动转换为目标类型 int nBandCount 要处理的波段数 int panBandMap 记录要操作的波段的索引 波段索引从 1 开始 的数组 若为空 则数组中存放的是前 nBandCount 个波段的索引 int nPixelSpace X 方向上两个相邻象素之间的字节偏移 默认为 0 则列间的实际字节偏移由目标数据类型 eBufType 确定 int nLineSpace y 方向上相邻两行之间的字节偏移 默认为 0 则行间的实际字节 偏移为 eBufType nBufXSize int nBandSpace 相邻两波段之间的字节偏移 默认为 0 则意味着波段是顺序结构 的 其间字节偏移为 nLineSpace nBufYSize 下面将通过实例演示其使用方法 实现的是将 7 波段图像中的第 2 3 4 波段按照 3 4 2 的顺序读 入内存中 逐像素存储 int bandmap 7 bandmap 0 3 bandmap 1 4 bandmap 2 2 Scanline nImagSizex 8 31 32 4 BYTE pafScan BYTE CPLMalloc sizeof byte nImgSizeX nImgSizeY poDataset RasterIO GF Read 0 0 nImgSizeX nImgSizeY pafScan nImgSizeX nImgSizeY GDT Byte bandmap Scanline 1 以这种方式读取之后 直接可构建位图进行显示 这里可以按照自己的需要进行其他方式读取 以上读取方式仅仅为了显示方便 如进行图像处理相关运算 则按波段全部读出会比较方便 poDataset RasterIO GF Read 0 0 nImgSizeX nImgSizeY pafScan nImgSizeX nImgSizeY GDT Byte bandcount 0 0 0 0 之前开辟内存改为 BYTE pafScan new byte nImgSizeX nImgSizeY bandcount 将图像数据读入内存后 即可通过指针 pafScan 对图像进行你想要进行的操作了 3 另存图像 另存图像 另存文件其实就是先创建一个新的文件 然后将数据写入新文件中 使用 gdal 创建新文件有两种方式 Create 和 CreateCopy 有些文件格式支持 Create 函数 见第一页表格第三列 可以使用 Create 直接创建此类格式的文件 而其他不支持 Create 函数的图像格式 需要先创建 tiff 格式文件 然后复制生成目标格式文件 CString strFilePath1 输入图像文件路径名 CString strFilePath2 另存为的 tiff 格式图像路径 CString strFilePath2 另存为的 jpeg 格式图像路径 GDALDataset poDataset1 GDAL 数据集 GDALDataset poDataset2 待创建的 GDAL 数据集 GDALDataset poDataset2 待创建的 GDAL 数据集 GDALDriver poDriver 驱动 用于创建新的文件 GDALAllRegister poDataset1 GDALDataset GDALOpen strFilePath1 GA ReadOnly 打开文件 if poDataset1 NULL AfxMessageBox 文件打开失败 m FileFlag FALSE return Create方式创建新的方式创建新的tiff文件文件 nBandCount poDataset1 GetRasterCount nImgSizeX poDataset1 GetRasterXSize nImgSizeY poDataset1 GetRasterYSize 获取影像相关信息 创建新文件 Cstring fomat fomat GTiff poDriver GetGDALDriverManager GetDriverByName fomat 设置文件类型 表格第二列为格式标识 保存为其他格通过改变 fomat 值即可 获取格式类型 char papszMetadata poDriver GetMetadata 根据文件路径文件名 图像宽 高 波段数 数据类型 文件类型 创建新的数据集 poDataset2 poDriver Create strFilePath2 nImgSizeX nImgSizeY nBandCount GDT Byte papszMetadata 坐标赋值 double adfGeoTransform 6 0 1 0 0 0 1 poDataset2 SetGeoTransform adfGeoTransform 将原图像数据读出 进行相应处理后 写入新文件 BYTE ppafScan new BYTE nImgSizeX nImgSizeY nBandCount poDataset1 RasterIO GF Read 0 0 nImgSizeX nImgSizeY ppafScan nImgSizeX nImgSizeY GDT Byte nBandCount 0 0 0 0 中间对图像进行处理运算 将图像数据写入新图像中 poDataset2 RasterIO GF Write 0 0 nImgSizeX nImgSizeY ppafScan pafsizex pafsizey GDT Byte nBandCount 0 0 0 0 delete poDataset2 delete poDriver 图像另存完毕 CreateCopy方式创建方式创建jpeg格式文件 格式文件 接上面的过程 先不 delete 即已经完成用 create 方式先将运算完毕的图像创建为 tiff 格式 fomat Jpeg poDriver GetGDALDriverManager GetDriverByName fomat poDataset3 poDriver CreateCopy strFilePath3 poDataset2 1 papszMetadata NULL NULL delete poDataset3 delete poDataset2 delete podriver 二 二 使用使用 RasterIO 对大图像进行分块操作对大图像进行分块操作 RasterIO 函数能够对图像任意指定区域任意波段的数据按指定数据类型 指定排列方式读 入内存和写入文件中 因此可以实现对大影像的分块读 运算 写操作 对于大图像处理 按 照传统方法 首先要将图像所有数据读入内存中 进行相应操作后 再一次性将处理好的数据 写入文件中 这样需要耗费很大内存 容易内存溢出 而且存续可执行行差 采用分块处理技 术 一幅 1G 的影像 在整个数据处理过程中 可以只占用几十兆的内存 而且运算量不会增 加 下面通过一个示例加以演示 所有波段分块处理示例 void CTestzwDoc OnLowers Inoutput dlg 获取文件路径的对话框类 if dlg DoModal IDCANCEL return CString strFilePath1 dlg m input CString strFilePath2 dlg m output GDALDataset poDataset1 GDAL 数据集 GDALDataset poDataset2 GDAL 数据集 GDALDriver poDriver GDALAllRegister poDataset1 GDALDataset GDALOpen strFilePath1 GA ReadOnly if poDataset1 NULL AfxMessageBox 文件打开失败 m FileFlag FALSE return int BandCount poDataset1 GetRasterCount int nImgSizeX poDataset1 GetRasterXSize int nImgSizeY poDataset1 GetRasterYSize 创建新文件 CString format format Gtiff poDriver GetGDALDriverManager GetDriverByName format char papszMetadata poDriver GetMetadata poDataset2 poDriver Create strFilePath2 nImgSizeX nImgSizeY nBandCount GDT Byte papszMetadata 设置图像坐标 缺少这一步 创建的图像用 erdas 打开将无法正常现实 poDataset2 SetGeoTransform adfGeoTransform 分块处理分块处理 将影像分成很多将影像分成很多 512 512 大小的块 通过循环对每一块进行处理大小的块 通过循环对每一块进行处理 int nxNum nImgSizeX 1 512 1 计算列方向上块数计算列方向上块数 int nyNum nImgSizeY 1 512 1 计算行方向块数计算行方向块数 int pafsizex 当前块宽度当前块宽度 int pafsizey 当前块高度当前块高度 BYTE lp BYTE ppafScan new BYTE 512 512 nBandCount for int nYI 0 nYI nyNum nYI for int nXI 0 nXIRasterIO GF Read nXI 512 nYI 512 pafsizex pafsizey ppafScan pafsizex pafsizey GDT Byte BandCount 0 0 0 0 对当前块进行处理 边缘提取对当

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论