GDAL分块处理流程

news/2024/7/21 5:13:47 标签: gdal, 图像处理, 算法,

使用GDAL在编写图像处理算法时,为了提高处理的效率,经常会进行分块处理,下面的代码是使用GDAL分块处理的一个简单示例:

图像分块代码

影像分块代码,只有输入输出图像路径,对原始图像经过一定的处理,将结果写入输出图像。此处原始图像和结果图像的大小完全一致。具体流程参考下面的代码以及里面的注释部分。

#include "gdal_priv.h"

bool ImageProcess(const char* pszSrcFile, const char* pszDstFile, const char* pszFormat)
{
    //注册GDAL驱动
    GDALAllRegister();

    //获取输出图像驱动
    GDALDriver *poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
    if (poDriver == NULL)   //输出文件格式错误
        return false;

    //打开输入图像
    GDALDataset *poSrcDS = (GDALDataset*)GDALOpen(pszSrcFile, GA_ReadOnly);
    if (poSrcDS == NULL)    //输入文件打开失败
        return false;

    //获取输入图像的宽高波段书
    int nXSize = poSrcDS->GetRasterXSize();
    int nYSize = poSrcDS->GetRasterYSize();
    int nBands = poSrcDS->GetRasterCount();

    //获取输入图像仿射变换参数
    double adfGeotransform[6] = { 0 };
    poSrcDS->GetGeoTransform(adfGeotransform);
    //获取输入图像空间参考
    const char* pszProj = poSrcDS->GetProjectionRef();

    GDALRasterBand *poBand = poSrcDS->GetRasterBand(1);
    if (poBand == NULL)    //获取输入文件中的波段失败
    {
        GDALClose((GDALDatasetH)poSrcDS);
        return false;
    }

    //创建输出图像,输出图像是1个波段
    GDALDataset *poDstDS = poDriver->Create(pszDstFile, nXSize, nYSize, 1, GDT_Byte, NULL);
    if (poDstDS == NULL)    //创建输出文件失败
    {
        GDALClose((GDALDatasetH)poSrcDS);
        return false;
    }

    //设置输出图像仿射变换参数,与原图一致
    poDstDS->SetGeoTransform(adfGeotransform);
    //设置输出图像空间参考,与原图一致
    poDstDS->SetProjection(pszProj);

    int nBlockSize = 256;     //分块大小

    //分配输入分块缓存
    unsigned char *pSrcData = new unsigned char[nBlockSize*nBlockSize*nBands];
    //分配输出分块缓存
    unsigned char *pDstData = new unsigned char[nBlockSize*nBlockSize];

    //定义读取输入图像波段顺序
    int *pBandMaps = new int[nBands];
    for (int b = 0; b < nBands; b++)
        pBandMaps[b] = b + 1;

    //循环分块并进行处理
    for (int i = 0; i < nYSize; i += nBlockSize)
    {
        for (int j = 0; j < nXSize; j += nBlockSize)
        {
            //定义两个变量来保存分块大小
            int nXBK = nBlockSize;
            int nYBK = nBlockSize;

            //如果最下面和最右边的块不够256,剩下多少读取多少
            if (i + nBlockSize > nYSize)     //最下面的剩余块
                nYBK = nYSize - i;
            if (j + nBlockSize > nXSize)     //最右侧的剩余块
                nXBK = nXSize - j;

            //读取原始图像块
            poSrcDS->RasterIO(GF_Read, j, i, nXBK, nYBK, pSrcData, nXBK, nYBK, GDT_Byte, nBands, pBandMaps, 0, 0, 0, NULL);

            //再这里填写你自己的处理算法
            //pSrcData 就是读取到的分块数据,存储顺序为,先行后列,最后波段
            //pDstData 就是处理后的二值图数据,存储顺序为先行后列

            memcpy(pDstData, pSrcData, sizeof(unsigned char)*nXBK*nYBK);
            //上面这句是一个测试,将原始图像的第一个波段数据复制到输出的图像里面

            //写到结果图像
            poDstDS->RasterIO(GF_Write, j, i, nXBK, nYBK, pDstData, nXBK, nYBK, GDT_Byte, 1, pBandMaps, 0, 0, 0, NULL);
        }
    }

    //释放申请的内存
    delete[]pSrcData;
    delete[]pDstData;
    delete[]pBandMaps;

    //关闭原始图像和结果图像
    GDALClose((GDALDatasetH)poSrcDS);
    GDALClose((GDALDatasetH)poDstDS);

    return true;
}

http://www.niftyadmin.cn/n/1784786.html

相关文章

sinffer 基础

network 体现了当前网络的使用情况packet /s 每秒数据包个数drop/s 每秒丢弃数据包个数broadcast/s 每秒广播包个数multicast/s 每秒组播包个数byte/s 每秒发送多少个字节error/s 每秒多少个错误utilization 网络使用率size distribution 数据…

Windows Azure 解决方案系列: Real World Windows Azure: 与CloudBerry Lab 商业开发副总经理,Pavel Bondarchuk的访谈...

公告&#xff1a;本博客为微软云计算中文博客的镜像博客。部分文章因为博客兼容性问题&#xff0c;会影响阅读体验。如遇此情况&#xff0c;请访问原博客。 作为Real World Windows Azure系列的一部分&#xff0c;我们采访了CloudBerry Lab 商业开发副总经理&#xff0c;Pavel …

GDAL2.x与1.x的主要变化比较

1、前言 GDAL库在2015年6月开始发布了2.0.0版本&#xff0c;同时与1.x的版本保持同步更新&#xff0c;GDAL2.x的最新版本已经发布到2.2.0&#xff08;2017年4月发布&#xff09;&#xff0c;并且1.x的最后发布的版本是在2016年7月1.11.5&#xff0c;至今再没有更新&#xff08…

[转载]BAT文件语法和技巧

首先&#xff0c;批处理文件是一个文本文件&#xff0c;这个文件的每一行都是一条DOS命令&#xff08;大部分时候就好象我们在DOS提示符下执行的命令行一样&#xff09;&#xff0c;你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文…

AI服务器的设计与实现

经过一段时间的设计与完善&#xff0c;我们游戏的AI服务器已经达到了基本的性能要求&#xff0c;目前单个AI进程可同时运行4000个频繁的AI对象。 在前面一篇博客中已经提到过&#xff0c;AI服务器的主逻辑循环是单线程的&#xff0c;这个线程上运行了数千个用户级线程&#xff…

word中MathType使用出现Mathpage.wll未找到解决方案

打开word时出现如下图1所示的错误&#xff0c;一般不是由MathType的问题引起的&#xff0c;而是由于插件不能正常在word中调用引起的。 解决方案如下&#xff1a; &#xff08;1&#xff09;依次打开word→文件→选项→信任中心→信任中心设置→添加新位置&#xff0c;在wo…

数据库维护作业重建索引失败(因QUOTED_IDENTIFIER SET 选项的设置不正确 )

近日用户反应数据库反应很慢&#xff0c;查看原因为&#xff1a;维护作业没有执行成功&#xff0c;出现 [Microsoft SQL-DMO (ODBC SQLState: 42000)] 错误 1934: [Microsoft][ODBC SQL Server Driver][SQL Server]DBCC 失败&#xff0c;因为下列 SET 选项的设置不正确: QUOTED…

c++中TRUE与true的区别,BOOL与bool的区别

FALSE/TRUE与false/true的区别 1.FALSE/TRUE与false/true的区别&#xff1a; false/true是标准C语言里新增的关键字&#xff0c;而FALSE/TRUE是通过#define&#xff0c;这要用途 是解决程序在C与C中环境的差异,以下是FALSE/TRUE在windef.h的定义&#xff1a; #ifndef FALSE…