GDAL读取影像并插值

影像读取 并缩放

读取大影像某一部分,并缩放到指定大小,我们有时会用如下代码:

#include "gdal.h"
#include "gdal_priv.h"
#include "gdalwarper.h"

void main()
{  
    GDALAllRegister();
    CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");//support Chinese
    
    GDALDataset* readDataSet = (GDALDataset*)GDALOpen(inputFile.c_str(),GA_ReadOnly);
    if (readDataSet == NULL )
    {
        return;
    }
    int width = readDataSet->GetRasterXSize();
    int height = readDataSet->GetRasterYSize();
    int bandCount = readDataSet->GetRasterCount();

    int tilesize = 50;
    unsigned char* data = new unsigned char[tilesize*tilesize*bandCount];
    if (readDataSet->RasterIO(GDALRWFlag::GF_Read,0,0,width,height,data,tilesize,tilesize,GDT_Byte,bandCount,NULL,0,0,0)==CPLErr::CE_Failure)
    {
        delete readDataSet;readDataSet=NULL;  
        delete data; 
        return;  
    }
}

如果这里影像大小,非常大时,几G到几十G,上百G的时候,会可能遇到什么问题?

让我们从RasterIO接口谈起,跟其中代码,得知

1、从影像金字塔取数据。根据缩小到的TileSize,它会从影像金字塔中取相应层级的数据。

2、取到数据后,会进行最近邻插值。

由于最近邻插值效果不佳,会导致得到的数据,都是相应的噪声,麻点现象。

GDAL从2.0版本支持RasterIO接口进行插值算法的配置,仅仅进行简单的配置,就可以解决这个问题。

     GDALRasterIOExtraArg exterArg;
     INIT_RASTERIO_EXTRA_ARG(exterArg);
     exterArg.eResampleAlg = GDALRIOResampleAlg::GRIORA_Bilinear;//配置插值方法
     readDataSet->RasterIO(GDALRWFlag::GF_Read,0,0,width,height,data,tilesize,tilesize,GDT_Byte,bandCount,NULL,0,0,0,&exterArg);

可以选择的插值方法:

    /*! Nearest neighbour */                               GRIORA_NearestNeighbour = 0,
    /*! Bilinear (2x2 kernel) */                           GRIORA_Bilinear = 1,
    /*! Cubic Convolution Approximation (4x4 kernel) */    GRIORA_Cubic = 2,
    /*! Cubic B-Spline Approximation (4x4 kernel) */       GRIORA_CubicSpline = 3,
    /*! Lanczos windowed sinc interpolation (6x6 kernel)*/ GRIORA_Lanczos = 4,
    /*! Average */                                         GRIORA_Average = 5,
    /*! Mode (the value which appears most often) */      GRIORA_Mode = 6,
    /*! Gauss blurring */                                  GRIORA_Gauss = 7

影像写出,如下操作:

  GDALDriver *pDriver;
    pDriver = GetGDALDriverManager()->GetDriverByName("GTiff");
    
    GDALDataset* gdalDataset;
    gdalDataset = pDriver->Create(outputFile.c_str(),tilesize,tilesize,bandCount,GDT_Byte,NULL);
    gdalDataset->RasterIO(GF_Write,0,0,tilesize,tilesize,data,tilesize,tilesize,GDT_Byte,bandCount,NULL,0,0,0);
    GDALClose(gdalDataset);
    gdalDataset = NULL;

 

参考:https://trac.osgeo.org/gdal/wiki/rfc51_rasterio_resampling_progress

 

转载于:https://www.cnblogs.com/geospatial/p/5630630.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将SAR影像读取到QWidget中,需要使用GDAL库。 GDAL(Geospatial Data Abstraction Library),是一个为GIS应用专门设计的开源库,它能够处理各种格式的地理空间数据。 下面是读取SAR影像到QWidget的步骤: 1. 引入GDAL库 在代码开头引入GDAL库的头文件。 ```cpp #include <gdal/gdal.h> #include <gdal/gdal_priv.h> #include <gdal/cpl_conv.h> ``` 2. 打开影像文件 使用GDAL的函数`GDALOpen()`打开SAR影像文件。函数返回的是GDALDataset类型的指针,代表影像文件。 ```cpp GDALDataset* poDataset = (GDALDataset*)GDALOpen("D:/sar_image.tif", GA_ReadOnly); ``` 其中,“D:/sar_image.tif”是影像文件的路径。GA_ReadOnly表示以只读模式打开影像文件。 3. 将影像数据读入内存 使用GDALDataset对象的方法`GetRasterBand()`和`RasterIO()`将影像数据读入内存中。 ```cpp GDALRasterBand* poBand = poDataset->GetRasterBand(1); // 获取第一波段 int nXSize = poBand->GetXSize(); int nYSize = poBand->GetYSize(); int* pData = new int[nXSize * nYSize]; // 分配内存 poBand->RasterIO(GF_Read, 0, 0, nXSize, nYSize, pData, nXSize, nYSize, GDT_Int32, 0, 0); ``` 其中,“1”代表第一波段,即影像的灰度值。 4. 显示影像数据 将影像数据显示到QWidget中。可以使用Qt自带的QImage和QPixmap类来处理图像数据。 ```cpp QImage image(pData, nXSize, nYSize, nXSize * sizeof(int), QImage::Format_Grayscale32); QPixmap pixmap = QPixmap::fromImage(image); ui->label_image->setPixmap(pixmap); ``` 其中,“ui->label_image”是需要显示影像数据的QWidget的标签。从QImage对象创建QPixmap对象,然后将QPixmap对象设置为QWidget中的图像。需要注意的是,只能显示灰度图像,不能显示彩色图像。 完成以上步骤,SAR影像就可以成功地读取到QWidget中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值