zoukankan      html  css  js  c++  java
  • 使用GDAL进行波段分离

    波段分离一般最常用的还是OpenCV,使用OpenCV的split方法可以直接对波段分离,并且效果不错,但是有一个问题是只能处理有限波段的数据,比如波段超过一定的数目就无法完成波段分离工作,或者数据有损失,所以就需要使用GDAL处理,并且可以实现不同的驱动方式实现图像的处理。

    OpenCV的波段发分离方式

    OpenCV中自带两个方法split方法和merge方法,两个方法可以实现图像的波段分离和波段的合并。

    #include <iostream>
    #include <opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main(){
    
        Mat mat = imread("E:/lena.jpg",CV_LOAD_UNCHANGED);
        string save = "E:/bands";
        vector<Mat> bands;
        split(mat,bands);
    
        char path[1024];
        for(int i = 0; i < bands.size(); i++)
        {
            sprintf(path,"%s/%d.tif",save.c_str(),i);
            imwrite(path,bands[i]);
        }
    
        return 0;
    }
    

    对于有限波段比如三波段或者四波段还能处理,但是超过几个波段时处理就会出现一些问题。

    GDAL波段分离

    对于遥感图像一般都有多个波段,分波段处理数据是一个比较常见的方式,但是OpenCV既然满足不了可以使用GDAL进行波段分离,本文使用的是GDAL2.04,下面是一个波段分离函数:

    // v是src文件,save文件是保存文件, bandIndex是需要的波段,1-n
    void Spearation(string v, string save, int bandIndex)
    {
    	char path[1024];
    	GDALAllRegister();
    	GDALDataset* datasetRead = (GDALDataset*)GDALOpen(v.c_str(), GA_ReadOnly);
    	GDALRasterBand* band = datasetRead->GetRasterBand(bandIndex);
    
    	int width = band->GetXSize();
    	int height = band->GetYSize();
    	GDALDataType type = band->GetRasterDataType();
    	sprintf(path, "%s/result_%d.tif",
    		save.c_str(),
    		bandIndex);
    
    	//可以是GTiff 或者 ENVI等不同的驱动
    	GDALDriver* driver = GetGDALDriverManager()->GetDriverByName("GTiff");
    	GDALDataset* datasetWrite = driver->Create(path,
    		width,
    		height, 1,
    		band->GetRasterDataType(), NULL);
    	GDALRasterBand* writer = datasetWrite->GetRasterBand(1);
    
    	unsigned char* pMemData = (unsigned char*)CPLMalloc(band->GetXSize() * 100);
    	int endFlag = band->GetYSize() / 100;
    	for (int i = 0; i < endFlag; i++)
    	{
    		band->RasterIO(
    			GF_Read, 0, i * 100,
    			width, 100, pMemData,
    			height, 100, GDT_Byte,
    			0, 0);
    
    		writer->RasterIO(
    			GF_Write, 0, i * 100,
    			width, 100, pMemData,
    			height, 100, GDT_Byte,
    			0, 0);
    	}
    	CPLFree(pMemData);
    	writer->FlushCache();
    }
    

    但是需要注意的是,GDAL的波段下标是从1开始的,如果直接使用0波段会报错的。

    源码分享

    源代码是采用的GDAL 2.04版本,开发IDE是Visual Studio 2019,下载地址:

    如果你有CSDN积分,请点击这个链接,支持一下博主,使用CSDN链接下载,如果没有CSDN积分可以使用博客园的下载链接直接下载。需要注意的是CSDN的里面都是全的,里面也复制了相关的dll文件,博客园的基本只有源代码,所以博客园的这个非常小,反正你真正需要的是源代码,不是具体程序和工程。

  • 相关阅读:
    mysql优化——语句优化小技巧
    mysql优化——索引与索引优化
    Mysql存储引擎
    Mysql优化技术
    数据库设计——三范式
    java多线程(二)——用到的设计模式
    java多线程(一)
    ubuntu下如何查看用户登录及用户操作相关信息
    hdu 2546
    hdu 2955
  • 原文地址:https://www.cnblogs.com/muxuan/p/gdal_band_split.html
Copyright © 2011-2022 走看看