如何将遥感图像读为Emgucv的Image<gray,float>形式

        基于VS2010的遥感图像处理,我们通常将遥感图像读为Emgucv中的Image<gray,float>形式。故处理遥感常用的库有Emgucv(基于.NET的opencv)和GDAL(GDAL提供对多种栅格数据的支持)库。

1、GDAL读取遥感数据

        GDAL库是一个跨平台的栅格地理数据格式库,包括读取、写入、转换、处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持)。它使用了一个单一的抽象数据模型就支持了大多数的栅格数据。

        GDAL常用的读取遥感数据的函数:

OSGeo.GDAL.Gdal.AllRegister();//对所有支持的文件格式进行注册

采用GDAL读取图像成功后,可以获取图像的一些基本信息,如下:

描述信息:const char*  GDALDataset::GetDriver()->GetDescription(),通常是图像的格式

图像大小:  图像宽度  int  GDALDataset::GetRasterXSize()

                   图像高度  int   GDALDataset::GetRasterYSize()

波段数:int   GDALDataset::GetRasterCount()     波段数即图像每个像素点所含的颜色种类,物理中的光学中学过颜色就是某频率的光波。波段少则一个,多则很多个,在遥感影象中波段通常有多个。

投影信息:GDALDataset::GetProjectionRef()    有的图像没有投影信息,不如一般的JPG、BMP格式图像。

地理坐标信息:double adfGeoTransform[6]   

                        GDALDataset::GetGeoTransform(adfGeoTransform)

                 地理坐标信息是一个含6个double型数据的数组,adfGeoTransform[1]和adfGeoTransform[5]表示东西和南北方向一个像素对应的距离,adfGeoTransform[0]和adfGeoTransform[3]表示左上角的坐标。

波段信息:数据集中重要的信息,有波段尺寸、数据类型、颜色信息等。

           获取波段的方法: GDALRasterBand *poBand;

                                 poBand = poDataset->GetRasterBand(i)     poBand为指向第i个波段的指针

波段尺寸:int   poBand->GetXSize()

                 int   poBand->GetYSize()

数据类型:const char*   GDALGetDataTypeName(poBand->GetRasterDataType())    

颜色信息:const char*   GDALGetColorInterpretationName(poBand->GetColorInterpretation())

2、读取遥感数据到Image<gray,float>中
 //从原图像数据中读取需要的数据到托管数组中
            float[] buffer = new float[roi.Width * roi.Height];
            srcBand.ReadRaster(
                roi.X, roi.Y,
                roi.Width, roi.Height,
                buffer,
                roi.Width, roi.Height,
                0, 0);
            //分配非托管内存
            IntPtr myPtr = System.Runtime.InteropServices.Marshal.AllocHGlobal(
                System.Runtime.InteropServices.Marshal.SizeOf(buffer[0]) * buffer.Length);
            //将托管数组中的数据赋值到非托管内存中
            System.Runtime.InteropServices.Marshal.Copy(buffer, 0, myPtr, buffer.Length);
            //利用非托管内存创建EmguCV的Image类的对象,并将数据复制到托管内存中
            Image<Gray, float> srcImg = new Image<Gray, float>(
                 roi.Width, roi.Height,
                 System.Runtime.InteropServices.Marshal.SizeOf(buffer[0]) * roi.Width,
                 myPtr)
                     .Copy();
            //释放从进程的非托管内存中分配的内存
            System.Runtime.InteropServices.Marshal.FreeHGlobal(myPtr);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值