gdal读写图像分块处理(精华版)

合集下载

C++调用GDAL库读取并输出tif文件,并计算斑块面积输出景观指数:CSD

C++调用GDAL库读取并输出tif文件,并计算斑块面积输出景观指数:CSD

C++调⽤GDAL库读取并输出tif⽂件,并计算斑块⾯积输出景观指数:CSD部分源码选⾃GDAL库的官⽅⽹址:,其余的代码为笔者⾃⼰编写。

1// readfile.cpp : 定义控制台应⽤程序的⼊⼝点。

2//3/*4part of the codes were cite from: /gdal_tutorial.html5and remaining of code were created :by /AmatVictorialCuram/6and please mark the site if you cite the program fo commercial of publication.7*/8 #include "stdafx.h"9 #include <iostream>10 #include "gdal.h"11 #include "gdal_priv.h"12/**/13 #include <iomanip>14 #include <fstream>15using namespace std;16/**/17int minLabel(int a,int b);1819int maxLabel(int a,int b);2021double csd(int *Parea,int length);2223int main()24 {25/*26 part of the codes were cite from: /gdal_tutorial.html27 and remaining of code were created :by /AmatVictorialCuram/28 and please mark the site if you cite the program fo commercial of publication.29*/30const char *pszFilename="E:\\tif/fragstats/sample.tif";31 GDALDataset *poDataset;3233 GDALAllRegister();3435 poDataset = (GDALDataset *) GDALOpen( pszFilename, GA_ReadOnly );36if( poDataset == NULL )37 {38 cout<<"file read error!"<<endl;;39 }40double adfGeoTransform[6];4142 printf( "Driver: %s/%s\n",43 poDataset->GetDriver()->GetDescription(),44 poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) );4546 printf( "Size is %dx%dx%d\n",47 poDataset->GetRasterXSize(), poDataset->GetRasterYSize(),48 poDataset->GetRasterCount() );4950if( poDataset->GetProjectionRef() != NULL )51 printf( "Projection is `%s'\n", poDataset->GetProjectionRef() );5253if( poDataset->GetGeoTransform( adfGeoTransform ) == CE_None )54 {55 printf( "Origin = (%.6f,%.6f)\n",56 adfGeoTransform[0], adfGeoTransform[3] );5758 printf( "Pixel Size = (%.6f,%.6f)\n",59 adfGeoTransform[1], adfGeoTransform[5] );60 }6162 GDALRasterBand *poBand;63int nBlockXSize, nBlockYSize;64int bGotMin, bGotMax;65double adfMinMax[2];6667 poBand = poDataset->GetRasterBand( 1 );68 poBand->GetBlockSize( &nBlockXSize, &nBlockYSize );69 printf( "Block=%dx%d Type=%s, ColorInterp=%s\n",70 nBlockXSize, nBlockYSize,71 GDALGetDataTypeName(poBand->GetRasterDataType()),77if( ! (bGotMin && bGotMax) )78 GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);7980 printf( "Min=%.3fd, Max=%.3f\n", adfMinMax[0], adfMinMax[1] );8182if( poBand->GetOverviewCount() > 0 )83 printf( "Band has %d overviews.\n", poBand->GetOverviewCount() );8485if( poBand->GetColorTable() != NULL )86 printf( "Band has a color table with %d entries.\n",87 poBand->GetColorTable()->GetColorEntryCount() );88/*****89 Reading Raster Data90 *****/91float *pafScanline;92int nXSize = poBand->GetXSize();93int nYSize=poBand->GetYSize();9495//读取图像的nXSize*nYSize数据96 pafScanline = (float*) CPLMalloc(sizeof(float)*nXSize*nYSize);//创建指针97 poBand->RasterIO(98 GF_Read,//第⼀个参数表⽰要读⼊数据还是写⼊数据990, 0,//nXOff, nYOff表⽰读取或者写⼊图像数据的起始坐标图像的左上⾓坐标为(0,0)100 nXSize, nYSize,/*nXSize, nYSize表⽰读取或者写⼊图像数据的窗⼝⼤⼩,nXSize表⽰宽度,101 nYSize表⽰⾼度,均使⽤像素为单位,该宽度和⾼度是从第⼆个和第三个参数处开始计算。

gdal影像分块读取处理和写出的程序

gdal影像分块读取处理和写出的程序

gdal影像分块读取处理和写出的程序1.引言1.1 概述概述部分的内容可以简要介绍本文将要探讨的内容,即gdal影像分块读取处理和写出的程序。

可以提及gdal是一种功能强大的地理数据抽象库,它提供了许多用于处理栅格和矢量数据的函数和工具。

在本文中,我们将重点关注gdal在影像数据处理中的应用。

首先,我们将介绍gdal影像分块读取处理的原因和意义。

在处理大型影像数据时,一次性将整个影像加载到内存中可能会导致内存溢出或性能下降的问题。

因此,我们需要将影像划分为多个块,并逐块进行读取和处理。

接下来,我们将详细介绍gdal如何进行影像的分块读取处理,包括块的定义、读取方式和处理方法等。

其次,我们将讨论gdal影像写出的程序。

将处理后的影像数据写出到硬盘中是一个重要的步骤,方便我们后续的分析和应用。

我们将介绍gdal 如何进行影像数据的写出,包括文件格式的选择、参数设置和输出路径的指定等。

最后,我们将总结本文的主要内容,并展望gdal在影像数据处理领域的未来发展。

gdal作为一个开源的地理数据处理工具,具有广泛的应用前景和不断增长的用户群体。

希望本文对读者了解gdal的影像分块读取处理和写出的程序有所帮助,并能够在实际应用中发挥其优势和功能。

1.2 文章结构文章结构部分(文章1.2)的内容如下:本篇长文主要分为以下几个部分:引言、正文和结论。

通过这个结构,将全面探讨GDAL影像分块读取处理和写出的程序。

引言部分将对本文的主题进行概述和解释。

我们将介绍GDAL (Geospatial Data Abstraction Library)的概念和功能,并介绍影像分块读取处理和写出的背景和意义。

同时,我们还会强调本文的目的和重要性。

正文部分将重点探讨GDAL影像分块读取处理和写出的程序。

在2.1小节中,我们将详细介绍GDAL对影像的分块读取处理方法,包括读取原始影像、设置分块大小和处理单个块的具体步骤。

在2.2小节中,我们将介绍GDAL影像写出程序的开发流程,包括对处理后的影像进行写出、设置输出格式和写出完成后的处理。

基于GDAL开源库的海量DOM分幅裁剪

基于GDAL开源库的海量DOM分幅裁剪

基于GDAL开源库的海量DOM分幅裁剪基于GDAL开源库的海量DOM分幅裁剪摘要:数字正射影像(Digital Orthophoto Map,DOM)是一种从航空或卫星遥感图像中获取的经过几何纠正和辐射定标的正射影像。

DOM广泛应用于土地利用规划、城市建设、资源调查和环境监测等领域。

海量DOM数据的获取和处理对于大规模区域的研究和分析具有重要意义。

本文以开源库GDAL为基础,探讨了海量DOM数据分幅裁剪的实现方法以及相应的优化策略。

1.引言随着遥感技术的不断发展和数据获取手段的进步,DOM数据的获取变得更加容易。

然而,随之而来的问题是大规模DOM数据的处理和管理。

传统的分幅策略需要耗费大量的时间和资源,因此寻找一种高效的分幅方法变得尤为重要。

基于GDAL开源库的分幅裁剪实现了对海量DOM数据的高效处理。

2. GDAL开源库简介GDAL(Geospatial Data Abstraction Library)是一个用于读取、写入和处理来自遥感器、卫星和数字地图数据的开源库。

GDAL支持多种标准的地理空间数据格式,并提供了许多功能强大的工具和函数,方便用户进行数据处理、转换和分析。

3. 海量DOM分幅裁剪方法3.1 DOM数据的预处理在进行分幅裁剪之前,首先需要对DOM数据进行预处理。

预处理的主要目的是对数据进行去噪处理、辐射定标和几何纠正,以确保数据的质量和准确性。

预处理阶段可以使用GDAL提供的函数和工具进行实现。

3.2 分幅裁剪算法分幅裁剪算法是实现DOM数据分幅的关键。

传统的分幅算法通常采用切片划分的方式,即将整个区域划分为若干个等大小的网格,然后根据网格边界对DOM数据进行裁剪。

然而,这种方法在处理海量DOM数据时存在计算资源和存储资源的浪费。

基于GDAL开源库的分幅裁剪算法采用了分块处理的思路。

首先将海量DOM数据划分为若干个大小相等的块,然后针对每个块进行裁剪。

裁剪的原则是保留块内包含有有效DOM数据的区域,即忽略块内没有有效数据的区域。

GDAL栅格图像操作

GDAL栅格图像操作

GDAL是一个操作各种栅格和矢量(由ogr这个库实现)地理数据格式的开源库。

包括读取、写入、转换、处理各种栅格和矢量数据格式(有些特定的格式对一些操作如写入等不支持)。

即使不是进行地理遥感方面的应用研究,GDAL也是一个非常有用的库,因为它可以支持大量我们常见的图像数据,比如jpg,gif之类的。

完整的格式清单可以到此链接查看/formats_list.html。

而且已经有包括GoogleEarth在内的很多软件都是在使用GDAL作为后台库。

本文就以VC8为开发平台介绍GDAL对栅格数据的操作方法。

下载安装GDAL的主页是/,下载安装的说明链接都能在上面找到,但是要说明的是直接在其主页上下载的GDAL对VC8的支持不太好。

因此可以直接到/Distrib/gdal.html去下载针编译好的针对VC8的GDAL,当前版本是1.41。

环境配置将压缩包下载后,解压到硬盘中,其目录结构如下:--\\bin\data\include\libInclude目录是开发中需要的头文件,lib中是所需要的lib文件,在VC8中应当将其存放目录添加到目录列表中,选择菜单的“工具-选项-项目和解决方案-VC++目录”,分别在“包含文件”和“库文件”中将此两个目录添加进去。

在项目的属性页中,选择“配置属性-链接器-输入”,在“附加依赖项”中添加gdal_i-vc8.lib和gdal_id-vc8.lib两个使用GDAL中需要的静态库文件,或者在程序中添加以下两行代码也可以。

#pragma comment(lib, "gdal_i-vc8.lib")#pragma comment(lib, "gdal_id-vc8.lib")Bin目录下的动态链接库文件应当放置于程序能够访问的位置,比如windows\system32中。

此外,在程序中需要引入的头文件是gdal_priv.h。

现在开始用C++来对图像文件进行操作。

gdal读写图像分块处理(精华版)

gdal读写图像分块处理(精华版)

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.获取图像信息、读取图像打开文件后,下面要做的就是获取文件的相关信息保存在相应变量中,将图像数据读入内存中,等待后续处理了。

GDAL(1.7版本)影像读取

GDAL(1.7版本)影像读取

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.获取图像信息、读取图像打开文件后,下面要做的就是获取文件的相关信息保存在相应变量中,将图像数据读入内存中,等待后续处理了。

C#中GDAL读写shp图层

C#中GDAL读写shp图层采⽤GDAL17的C#库进⾏shp图层属性表读取和修改操作,C#DLL库解压后包含⽂件如下:添加引⽤主要是带csharp的gdal、ogr、osr三个DLL,程序代码如下:using OSGeo.OGR;using OSGeo.OSR;using OSGeo.GDAL;1. 读取shp图层操作public void Reforming(string shpFilePath){Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");Gdal.SetConfigOption("SHAPE_ENCODING", "");Ogr.RegisterAll();// 注册所有的驱动DataSource ds = Ogr.Open(shpFilePath, 1);//0表⽰只读,1表⽰可修改if (ds == null) { MessageBox.Show("打开⽂件【{0}】失败!", shpFilePath); return; }// 获取第⼀个图层int iLayerCount = ds.GetLayerCount();Layer oLayer = ds.GetLayerByIndex(0);if (oLayer == null) { MessageBox.Show("获取第{0}个图层失败! n", "0"); return; }fieldList = GetFieldList(oLayer);//获取图层属性表字段列表int featureCount = oLayer.GetFeatureCount(0);//B1.判断字段是否存在#region shp属性表{if (!fieldList.Contains("LL_YAW")){FieldDefn oFieldYaw = new FieldDefn("LL_YAW", FieldType.OFTReal);oFieldYaw.SetWidth(10);oFieldYaw.SetPrecision(8);oLayer.CreateField(oFieldYaw, 1);}if (!fieldList.Contains("LL_ScaleX")){FieldDefn oFieldYaw = new FieldDefn("LL_ScaleX", FieldType.OFTReal);oFieldYaw.SetWidth(10);oFieldYaw.SetPrecision(8);oLayer.CreateField(oFieldYaw, 1);}if (!fieldList.Contains("LL_ScaleY")){FieldDefn oFieldYaw = new FieldDefn("LL_ScaleY", FieldType.OFTReal);oFieldYaw.SetWidth(10);oFieldYaw.SetPrecision(8);oLayer.CreateField(oFieldYaw, 1);}}#endregion//输出属性表字段的详细信息,数据类型、宽度、精度等FeatureDefn oDefn1 = oLayer.GetLayerDefn();int FieldCount1 = oDefn1.GetFieldCount();string headerInfo = string.Empty;{for (int i = 0; i < FieldCount1; i++){FieldDefn oField = oDefn.GetFieldDefn(i);headerInfo += String.Format("{0}:{1} {2} {3}", oField.GetNameRef(), oField.GetFieldTypeName(oField.GetFieldType()), oField.GetWidth(), oField.GetPrecision()); headerInfo += Environment.NewLine;}}MessageBox.Show(headerInfo);Feature oFeature = null;while ((oFeature = oLayer.GetNextFeature()) != null){string name = oFeature.GetFieldAsString(0);double x = oFeature.GetFieldAsDouble(1);double y = oFeature.GetFieldAsDouble(2);double z = oFeature.GetFieldAsDouble(3);//B3.给新增加的字段赋值oFeature.SetField(7, x);oFeature.SetField(8, y);oFeature.SetField(9, z);oLayer.SetFeature(oFeature);//保存记录}oLayer.Dispose();ds.Dispose();//关闭数据集}private List<string> GetFieldList(Layer mLayer){List<string> newFieldList = new List<string>();FeatureDefn oDefn = mLayer.GetLayerDefn();int FieldCount = oDefn.GetFieldCount();for (int i = 0; i < FieldCount; i++){FieldDefn oField = oDefn.GetFieldDefn(i);string fieldName = oField.GetNameRef();newFieldList.Add(fieldName);}return newFieldList;}}需要创建或获取shp图层的Spatial Reference空间参考坐标系WKT时,代码如下:OSGeo.OSR.SpatialReference siref = oLayer.GetSpatialRef();siref.ExportToWkt(out layerCSWKT);siref.ImportFromWkt(ref layerCSWKT);2.创建shp图层,并将点的坐标值写⼊属性表代码如下:private void button2_Click(object sender, EventArgs e){OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");// 为了使属性表字段⽀持中⽂,请添加下⾯这句OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "");string strVectorFile1 = @"C:\Users\DZY\Desktop\test6";Ogr.RegisterAll();string strDriver = "ESRI Shapefile";Driver oDriver = Ogr.GetDriverByName(strDriver);if (oDriver == null){MessageBox.Show(" 驱动不可⽤!\n", strVectorFile1);return;}DataSource ds1 = oDriver.CreateDataSource(strVectorFile1,null);if (ds1 == null){MessageBox.Show("创建⽮量⽂件【%s】失败!\n", strVectorFile1);return;}string wkt = "…";//⾃定义投影坐标系的WKTOSGeo.OSR.SpatialReference sr = new OSGeo.OSR.SpatialReference(wkt);Layer olayer1 = ds1.CreateLayer("PointLayer",sr,wkbGeometryType.wkbPoint,null);//接下来创建属性表字段// 先创建⼀个叫FieldID的整型属性FieldDefn oFieldID = new FieldDefn("FieldID", FieldType.OFTInteger);olayer1.CreateField(oFieldID, 1);// 再创建⼀个叫FeatureName的字符型属性,字符长度为50FieldDefn oFieldName = new FieldDefn("FieldName", FieldType.OFTString);oFieldName.SetWidth(50);olayer1.CreateField(oFieldName, 1);//创建x坐标字段FieldDefn oFieldX = new FieldDefn("x", FieldType.OFTReal);oFieldX.SetWidth(10);oFieldX.SetPrecision(8);olayer1.CreateField(oFieldX, 1);//创建y坐标字段FieldDefn oFieldY = new FieldDefn("y", FieldType.OFTReal);oFieldY.SetWidth(10);oFieldY.SetPrecision(8);olayer1.CreateField(oFieldY, 1);//创建z坐标字段FieldDefn oFieldZ= new FieldDefn("z", FieldType.OFTReal);oFieldZ.SetWidth(10);oFieldZ.SetPrecision(8);olayer1.CreateField(oFieldZ, 1);//写⼊第⼀条数据FeatureDefn oDefn = olayer1.GetLayerDefn();Feature oFeature = new Feature(oDefn);oFeature.SetField(0, 0);oFeature.SetField(1, "Point1");oFeature.SetField(2, 489592.624);oFeature.SetField(3, 3804367.891);oFeature.SetField(4, 386.3);Geometry geoPoint = new Geometry(OSGeo.OGR.wkbGeometryType.wkbPoint); geoPoint.AddPoint(489592.624, 3804367.891, 386.3);oFeature.SetGeometry(geoPoint);olayer1.CreateFeature(oFeature);//写⼊第⼆条数据Feature oFeature1 = new Feature(oDefn);oFeature1.SetField(0, 1);oFeature1.SetField(1, "Point2");oFeature1.SetField(2, 489602.624);oFeature1.SetField(3, 3804367.891);oFeature1.SetField(4, 389.3);geoPoint.AddPoint(489602.624, 3804367.891, 389.3);oFeature1.SetGeometry(geoPoint);olayer1.CreateFeature(oFeature1);oFeature1.Dispose();olayer1.Dispose();ds1.Dispose();MessageBox.Show("shp图层创建完成!");}ArcMap中加载效果如下:多个点可采取循环遍历的⽅式实现。

Python空间数据处理之GDAL读写遥感图像

Python空间数据处理之GDAL读写遥感图像GDAL是空间数据处理的开源包,⽀持多种数据格式的读写。

遥感图像是⼀种带⼤地坐标的栅格数据,遥感图像的栅格模型包含以下两部分的内容:栅格矩阵:由正⽅形或者矩形栅格点组成,每个栅格点所对应的数值为该点的像元值,在遥感图像中⽤于表⽰地物属性值;遥感图像有单波段与多波段,波段表⽰地物属性的种类,每个波段表⽰地物⼀种属性。

⼤地坐标:空间数据参考表⽰地图的投影信息;仿射矩阵能将⾏列坐标映射到⾯坐标上。

GDAL读写遥感数据的代码:from osgeo import gdalimport osclass GRID:#读图像⽂件def read_img(self,filename):dataset=gdal.Open(filename) #打开⽂件im_width = dataset.RasterXSize #栅格矩阵的列数im_height = dataset.RasterYSize #栅格矩阵的⾏数im_geotrans = dataset.GetGeoTransform() #仿射矩阵im_proj = dataset.GetProjection() #地图投影信息im_data = dataset.ReadAsArray(0,0,im_width,im_height) #将数据写成数组,对应栅格矩阵del datasetreturn im_proj,im_geotrans,im_data#写⽂件,以写成tif为例def write_img(self,filename,im_proj,im_geotrans,im_data):#gdal数据类型包括#gdal.GDT_Byte,#gdal .GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32,#gdal.GDT_Float32, gdal.GDT_Float64#判断栅格数据的数据类型if 'int8' in im_:datatype = gdal.GDT_Byteelif 'int16' in im_:datatype = gdal.GDT_UInt16else:datatype = gdal.GDT_Float32#判读数组维数if len(im_data.shape) == 3:im_bands, im_height, im_width = im_data.shapeelse:im_bands, (im_height, im_width) = 1,im_data.shape#创建⽂件driver = gdal.GetDriverByName("GTiff") #数据类型必须有,因为要计算需要多⼤内存空间dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)dataset.SetGeoTransform(im_geotrans) #写⼊仿射变换参数dataset.SetProjection(im_proj) #写⼊投影if im_bands == 1:dataset.GetRasterBand(1).WriteArray(im_data) #写⼊数组数据else:for i in range(im_bands):dataset.GetRasterBand(i+1).WriteArray(im_data[i])del datasetif __name__ == "__main__":os.chdir(r'D:\Python_Practice') #切换路径到待处理图像所在⽂件夹run = GRID()proj,geotrans,data = run.read_img('LC81230402013164LGN00.tif') #读数据print projprint geotransprint dataprint data.shaperun.write_img('LC81230402013164LGN00_Rewrite.tif',proj,geotrans,data) #写数据在GDAL遥感影像读写的基础上,我们可以进⾏遥感图像的各种公式计算和统计分析。

基于gdal库的遥感图像处理

㊀118㊀㊀城市地理基于GDAL库的遥感图像处理杨学博(武汉大学遥感信息工程学院,湖北㊀武汉㊀430072)摘要:本文介绍了GDAL库的功能和特点,以及在开发遥感图像处理软件中的帮助和优势㊂以VC6.0为基础进行编程,链接到GDAL库来实现对不同格式(img㊁bmp等)遥感图像的处理,本文详细讲述变换检测㊁植被指数这两种常用的遥感图像处理的实现,为遥感软件的开发提供参考㊂关键词:遥感图像处理软件;GDAL;变换检测;植被指数一㊁概论随着遥感数字图像在社会的许多领域开始发挥越来越重要的作用,如何处理遥感图像㊁从遥感图像中获取我们所需要的信息,实现遥感图像理解,成为人们关注的焦点㊂短时间内,我们很难用有限的开发力量和资金开发出专业的系统软件,但利用普通的开发工具进行简单的开发,可以为我国开发自己的遥感处理软件提供的思路和参考㊂本文选用Microsoft基本类库 MFC,是C++的Mi-crosoft Windows API,使用MFC建立的应用程序框架所产生的程序代码短而且运行速度快㊂MFC库引入Windows消息映射机制,我们可以将各种图像处理的功能函数写入菜单命令或按钮命令,以消息映射的方式对图像进行处理㊂另一方面,本文采用GDAL库作为开发工具㊂GDAL是一个在X/MIT许可协议下的开源栅格空间数据转换库,它利用抽象数据模型来表达所支持的绝大多数栅格数据文件的读写操作,同时针对数据转换和处理,还预设了各种有用的命令行工具㊂GDAL库有着读取数据类型广泛,数据读取方式多样,支持地理坐标系统等优点,为我们的开发提供了很大帮助㊂二㊁软件架构(一)框架搭建以VC6.0为例,首先在Visual C++中新建一个MDI工程,在已有的DOC类㊁VIEW类基础上新建用于读取数据的GDALData类,用于图像处理的ImagePro类,以及根据需要自己定义的类㊂a.CMainFrame:主框架窗口对象;b.CDocument:用于打开㊁保存和关闭文档,加入对GDALData类的调用,用于窗口显示㊁图像处理和数据保存;c.GDALData:包含各种成员函数,用于打开图像数据集,分块读取和变换数据格式等;d.ImagePro:包含各种以CDocument类的数据成员作为参数图像处理算法函数㊂(二)GDAL开源库安装GDAL库各版本在Windows或者其他操作系统下安装步骤大致相同㊂由于此处采用VC编程,故介绍一种在VC下配置GDAL环境的方法㊂(以VC6.0为例)a.将GDAL中的include目录复制到当前新建工程目录;b.将bin目录下的gdal14.dll直接放置在Debug目录,将lib目录放在新建工程目录;c.在VC工程下点击 Project->Setting ,在弹出的对话框中点击 Link ,在 Object/library modules 栏下输入 lib/gdal_i.lib ㊂通过以上步骤便在VC下配置好GDAL环境,这种方法相较于在windows上安装GDAL开源库的好处在于新建的VC6.0工程环境不会随着PC机环境的变化而发生变化㊂三㊁软件功能设计(一)读取与显示使用GDAL库进行图像文件的读取与显示㊂配置好GDAL库后,一是在VC工程中要包含GDAL开源库的头文件,二是要添加GDALAllRegister()函数,实现对GDAL开源库所有已知驱动的注册㊂之后再编写函数,调取其内函数实现对不同格式图像的读取㊂在图像显示的过程中,先判断其包含波段数,若为1个波段,即将其一次性读取并显示,若为多个波段,则选择其中3个波段分别赋予RGB像素值后显示㊂一般来将,选择遥感影像的4㊁3㊁2波段分别作为RGB值合成的即是标准的假彩色影像㊂最后以bmp格式显示在MFC中㊂(二)变换检测变化检测是从不同时期的遥感数据中定量分析和确定地表变化的特征与过程㊂一般流程是先获得两幅同一地点不同时间图像的差异图像,再对差异图像进行处理,将像素点分成变化和无变化两类㊂具体编程思想:注册GDAL库,读取变换前后图像并获得变换前后图像的高度㊁宽度和波段数;定义数组并获得图像对应波段灰度值;遍历像素,对每个像素做9邻域均值后再做差值;判断差值是否超过阈值,超过则结果所对应的该像素为黑色0;最后.以bmp格式文件保存结果(三)植被指数归一化差异指数NDVI的计算公式如下:NDVI=(IR-RED)/(IR+RED)即为TM影像的第三波段近红外与第四波段红外的计算㊂NDVI的值在(-1,1)范围内,负值表示地面覆盖为云㊁水㊁雨等,对可见光高反射;0表示有岩石或裸土等,正值表示有植被覆盖,且随覆盖度增大而增大㊂为了显示图像方便,还需将NDVI拉伸到(0,255)范围内并显示㊂植被指数编程实现的流程图如图1:图1㊀NDVI编程实现流程图由于计算所得NDVI值都较小,直接显示不明显,所以一定要将NDVI值进行现行拉伸,到(0,255)范围内,这样可清楚看到各地的植被覆盖度㊂四㊁实验结果(一)变换检测由于不同时间同一卫星拍到的同一地图的影像依旧存在大气㊁日照等诸多外环境的干扰,所以导致原始图像差异很大,造成结果图像大部分都为变换区域㊂所以设计了差值法的同时设计了比值法㊂而且采用的领域均值后再做变换检测的思想可以减少这一外部环境的影响㊂本文采用湖北同一地区2001年和2002年的遥感影像进行试验,如图2所示:图2㊀(1)2001年影像(2)2002年影像(3)差值法结果(4)比值法结果GLOBAL CITY GEOGRAPHY㊀㊀㊀㊀㊀㊀㊀119㊀㊀㊀(二)植被指数实验以宜昌地区一张多波段混合的影像,植被指数结果如图3:图3㊀宜昌地区影像(左Spot 影像;右NDVI )五㊁结论与展望本人用VC 编程在GDAL 库的基础上实现了对不同格式遥感图像的读取与处理,详细讲述了变换检测和植被指数这两种常用的方法,并得到了比较好的结果㊂亮点在于提出先对图像做中值处理等图像模糊操作,再进行差值法或比值法变换检测以减小由于外界因素造成了图像误差,同时使得变换检测的效果更好㊂同时本文提出的对植被指数计算的编程设计不仅可以对多波段图像处理,还可以对分波段图像处理㊂工欲善其事,必先利其器㊂GDAL 库与Visual C ++的完美结合,为我们的开发提供很大帮助㊂本文提出图像处理类软件框架搭建的方法,同时提出优质效果的变换检测和植被指数计算算法,为遥感软件的开发提供参考㊂参考文献:[1]杨枝灵王凯.Visual C ++数字图像获取处理及实践应用[M ].人民邮电出版社,2003(1).[2]孙家炳.遥感原理与应用第二版[M ].武汉大学出版社,2009(6).[3]贾永红张谦崔卫红余卉.数字图象处理实习教程第二版[M ].武汉大学出版社,2012(1).作者简介:杨学博(1995-),女,汉族,山西吕梁人㊂武汉大学遥感信息工程学院,2012级本科生,地理信息系统方向㊂土地测量中新航空数码摄影测量技术的应用分析秦国敏1㊀唐朝霞2(桂林市临桂区国土资源局会仙镇国土资源管理所,广西㊀临桂㊀541199)1(广西有色金属集团资源勘查有限公司,广西㊀南宁㊀530022)2摘要:随着我国综合国力的不断上升,以及科学技术的不断进步,航空摄影测量技术现已广泛应用于复杂地形㊁城市测绘㊁国界等需要测绘的区域㊂随着航空摄影测量技术的发展,土地等的测绘技术也向着数字化的方向转变,继而出现了数字航摄仪DMC ㊁IMU ㊁DGPS 新技术㊁LIDAR 激光测高扫描系统等摄影测量的新技术㊂关键词:土地测绘;新航空;数码;摄影技术引言可以说摄影测量的历史是较为久远的㊂摄影技术出现在19世纪中期,该技术一出现就被应用到测量行业中㊂以模拟测量为开端,经过一系列的变化阶段,现今已经进入到航空摄影测量的新阶段㊂航空数码摄影测量技术作为新型地图测绘技术中的一种,其灵活㊁快速以及高效的特点已经深受国土测绘㊁灾害应急㊁林业监控㊁交通测绘等行业的青睐,本文以广西地区为例,介绍航空数码摄影测量技术在土地测绘中的应用,总结了航空数码摄影测量技术的优越性㊂1.广西地区土地资源概况广西壮族自治区位于我国的南部,位于北纬20ʎ54ᶄ~26ʎ23ᶄ,东经104ʎ29ᶄ~112ʎ04ᶄ.南临北部湾,与海南省隔海相望,东连广东,东北接湖南,西北靠贵州,西邻云南,西南与越南为邻.陆地区域面积23.67万平方公里,占全国国土总面积的2.5%,居各省区市第9位.广西属沿海地区.北部湾海域面积约为12.93万平方公里,海岸线东起粤桂交界处的洗米河口,西至中越边境的北仑河口,大陆海岸线长1500多公里.海岸类型分冲积平原海岸和台地海岸两种.沿海岛屿有697个,岛屿岸线长600余公里,岛屿总面积84平方公里.涠洲岛是广西沿海最大的岛屿,面积约28平方公里㊂广西土地面积共2367万公顷,占全国面积的3.47%㊂2001年底广西人口为4788万人,人均占有土地面积0.50公顷,低于全国人均占有土地0.74公顷的水平㊂人多地少,是广西土地资源的显著特点㊂跟据第二次土壤普查的结果,按照在同一生物生存的条件㊁具有独立的成土过程以及共同特征及属性的一类土壤作为同一一个土类,广西地区的土壤可以分为14种土壤类型以及25种亚类㊂其中8个主要的土类:水稻土:广西最大的一类耕作土壤,在广西地区农业生产中占据着极为重要的地位,共计164.8O 万公顷,占此次普查总面积的10.2%㊂主要分布在海拔500米以下的谷地㊁丘陵㊁盆地,溶蚀平原以及坡㊁台阶地,其中贵港㊁南宁㊁玉林等地分布较广㊂广西地区土地分类比例如图一㊂图一㊀广西地区土地分类比例2.低空数码航空摄影技术测量的原理以及工作流程2.1低空数码航空摄影技术测量的原理低空数码航空摄影技术测量,采用的是小型(或微型或轻型)飞机作为该技术的飞行承载平台,此技术要在事先准。

图像处理中的图像分割与提取方法

图像处理中的图像分割与提取方法图像分割与提取在图像处理中是非常重要的技术,它能够将一幅图像分割成不同的区域,并且提取出感兴趣的目标。

图像分割与提取的应用广泛,涉及到医学图像分析、计算机视觉、遥感图像分析等领域。

本文将介绍几种常用的图像分割与提取方法。

1. 阈值分割阈值分割是最简单也是最常用的图像分割方法之一。

该方法通过设定一个或多个阈值,将图像分成不同的区域。

阈值的选取可以根据图像的特点和需求来确定。

在灰度图像中,通常使用单一阈值来分割图像;而在彩色图像中,可以同时对多个颜色通道进行分割,或者将颜色空间转换为其他颜色空间进行分割。

2. 区域生长区域生长是一种基于像素相似性的图像分割方法,其基本思想是选择一个或多个种子点,然后根据像素相似性的准则逐步生长区域,直到满足停止准则为止。

区域生长方法对于具有明显边界的目标图像分割效果较好。

在实际应用中,可以使用均值、标准差、梯度等准则来评估像素之间的相似性。

3. 边缘检测边缘检测是一种常用的图像提取方法,其目的是识别图像中的边界。

边缘是图像中像素灰度变化明显的地方,可以通过求取像素灰度值的梯度来检测。

常用的边缘检测算法包括Sobel算子、Prewitt算子、Canny算子等。

在实际应用中,边缘检测算法通常需要经过非极大值抑制、双阈值处理等步骤进行优化。

4. 分水岭算法分水岭算法是一种基于图论的图像分割算法,它模拟了水在图像中流动的过程。

该算法首先将图像中的亮度值作为高度值构建一个二维拓扑图,然后根据图像中的边缘信息和像素灰度值的梯度计算图像中各个区域的边界。

通过对边界进行变换,可以将图像分割成不同的区域。

分水岭算法在处理具有复杂纹理和连续边界的图像时效果较好。

5. 基于深度学习的方法近年来,基于深度学习的图像分割与提取方法取得了显著的进展。

通过搭建深度神经网络,可以利用大规模训练样本进行图像分割与提取任务。

常见的深度学习方法包括全卷积神经网络(FCN)、U-Net、Mask R-CNN等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//获取格式类型 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);
int nLineSpace, //y 方向上相邻两行之间的字节偏移, 默认为 0,则行间的实际字

//偏移为 eBufType * nBufXSize
int nBandSpace //相邻两波段之间的字节偏移,默认为 0,则意味着波段是顺序结

//的,其间字节偏移为 nLineSpace * nBufYSize
. . 『中间对图像进行处理运算』 . //将图像数据写入新图像中 poDataset2->RasterIO(GF_Write, 0,0, nImgSizeX, nImgSizeY, ppafScan,pafsizex,pafsizey, GDT_Byte,nBandCount,0,0, 0,0 );
);
下面将通过实例演示其使用方法,实现的是将 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*3) poDataset->RasterIO( GF_Read, 0, 0,nImgSizeX,nImgSizeY, pafScan, nImgSizeX,nImgSizeY,GDT_Byte,3,bandmap,3, Scanline*3,1 );
void * pData,
//指向目标缓冲区的指针,由用户分配
int nBufXSize, int nBufYSize,//目标块在 x 方向上和 y 方向上的大小
GDALDataType eBufType, //目标缓冲区的数据类型,原类型会自动转换为目标
类型
int nBandCount,
//要处理的波段数
//时,这种坐标表示方法将不适用。
2.2 将图像数据按照要求读入内存
图像的读写是通过 RasterIO()实现的。RasterIO()功能十分强大,它可以把图像上指
定大小的矩形象素块以缩放的形式按指定的数据类型输出或输入到用户指定大
小的缓冲区中。
原型:
CPLErr GDALDataset::RasterIO(
CString strFilePath; StrFilePath=’d:/rsdata/2005_234.tif’; GDALDataSet *poDataset; //GDAL 数据集 GDALAllRegister(); poDataset = (GDALDataset *) GDALOpen(strFilePath, GA_ReadOnly );
int * panBandMap, //记录要操作的波段的索引(波段索引从 1 开始)的数组,若
为空
//则数组中存放的是前 nBandCount 个波段的索引
int nPixelSpace, //X 方向上两个相邻象素之间的字节偏移,默认据类型 eBufType 确定
delete poDataset2; delete poDriver; //图像另存完毕
CreateCopy 方式创建 jpeg 格式文件: 接上面的过程,先不 delete,(即已经完成用 create 方式先将运算完毕的图像创建 为 tiff 格式) fomat="Jpeg" poDriver = GetGDALDriverManager()->GetDriverByName(fomat); poDataset3=poDriver->CreateCopy(strFilePath3,poDataset2,1,papszMetadata,NULL,
//将原图像数据读出,进行相应处理后,写入新文件 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 );
这样我们就打开了这个文件。通过数据集 poDataset 即可调用各功能函数,如: GetRasterCount();//获取图像波段数; GetRasterXSize();//获取图像宽度 GetRasterYSize();//获取图像高度 GetRasterBand();//获取图像某一波段 GetGeoTransform(double *p);//获取图像地理坐标信息长度为六的数组 RasterIO();//对图像数据进行缩放读和写 …… (更具体的 API 列表可以看这里)。
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()并不能十分合理的表示图像地理坐标,当影像范围很 大
以这种方式读取之后,直接可构建位图进行显示。这里可以按照自己的需要进行 其他方式读取。以上读取方式仅仅为了显示方便,如进行图像处理相关运算,则 按波段全部读出会比较方便: 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; //驱动,用于创建新的文件
2.获取图像信息、读取图像 打开文件后,下面要做的就是获取文件的相关信息保存在相应变量中,将图像数 据读入内存中,等待后续处理了。
2.1 获取基本信息 因为不同格式数据所包含的相关信息有所不同,一般情况下我们需要得到图像的 高、宽、波段数、地理坐标信息,数据类型等。Gdal 库中有相应的函数实现这 些功能。下面的代码实现获取这些信息:
gdal 读写图像分块处理(精华版) /* 版权所有者:赵文 */
一.gdal 进行数据操作 在安装好 gdal 后,即可调用 gdal 库中的函数。 (需要包含的头文件:gdal_priv.h) 1.打开数据集 使用 gdal 库进行数据(影像)操作的第一步就是打开一个数据集。对于“数据集” 这个名词大家可能不会太习惯,但是对于一般的格式来说,一个“数据集”就是一 个文件,比如一个 TIFF 文件就是一个以 tiff 为扩展名的文件。但是对于众多 RS 数据来说,一个数据集包含的绝对不仅仅是一个文件。对于很多 RS 数据,他们 把一张图像分成数个图像文件,然后放在一个文件夹中,用一些额外的文件来组 织它们之间的关系,形成一个“数据集”(有点难以理解,暂且放过)。下面我们由 给定的文件路径文件名打开一个 tiff(GeoTIFF)文件。(任何支持的格式,打开方 式都是这样)
相关文档
最新文档