波段分离一般最常用的还是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文件,博客园的基本只有源代码,所以博客园的这个非常小,反正你真正需要的是源代码,不是具体程序和工程。

使用GDAL进行波段分离的更多相关文章

  1. 1. GDAL与OpenCV2.X数据转换(适合多光谱和高光谱等多通道的遥感影像)

    一.前言 GDAL具有强大的图像读写功能,但是对常用图像处理算法的集成较少,OpenCV恰恰具有较强的图像处理能力,因此有效的结合两者对图像(遥感影像)的处理带来了极大的方便.那么如何实现GDAL与o ...

  2. GDAL与OpenCV2.X数据转换(适合多光谱和高光谱等多通道的遥感影像)

    一.前言 GDAL具有强大的图像读写功能,但是对常用图像处理算法的集成较少,OpenCV恰恰具有较强的图像处理能力,因此有效的结合两者对图像(遥感影像)的处理带来了极大的方便.那么如何实现GDAL与o ...

  3. GDAL生成Erdas Imagine

    GDAL原生支持超过100种栅格数据类型,涵盖所有主流GIS与RS数据格式,包括•  ArcInfo grids, ArcSDE raster, Imagine, Idrisi, ENVI, GRAS ...

  4. GDAL关于读写图像的简明总结

    读写影像可以说是图像处理最基础的一步.关于使用GDAL读写影像,平时也在网上查了很多资料,就想结合自己的使用心得,做做简单的总结. 在这里写一个例子:裁剪lena图像的某部分内容,将其放入到新创建的. ...

  5. GDAL 遥感图像处理后的数据保存为图像文件的实现方法

    在遥感图像处理中,GDAL库不仅能读取和处理大部分的遥感图像数据,而且还能够实现图像处理后将数据保存为图像的功能. 本文就详细介绍如何将内存中的图像数据保存为.tif格式. 首先,遥感数据处理完,保存 ...

  6. [GDAL]读取HDF格式的calipso数据

    探测地球云层分布的CloudSat和CALIPSO卫星 http://www.nasa.gov/mission_pages/calipso/main/index.html http://www.nas ...

  7. 了解GDAL的图像处理/Python

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

  8. GDAL读取tiff文件/C++源码

    // gdal_geotiff.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "gdal_priv.h&quo ...

  9. 完善GDAL与OpenCV间的数据格式转换与影像分块读写

    本博客为原创内容,未经博主允许禁止转载,商用,谢谢. 一.前言 关于GDAL与openCV间的数据格式转换,在我之前的博客中已有简要说明,这里,由于最近工作上经常用到openCV里的函数进行图像处理, ...

随机推荐

  1. 接口实现后台GZIP压缩,pako.js 前端解压

    import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException; ...

  2. LA、Remember the Word (字典树, 简单dp)

    传送门 题意: 给你一个初始串 S,strlen(s) <= 3e5  然后给你 n 个单词. n <= 4000,  每个单词的长度不超过 100 : 问你这个初始串,分割成若干个单词的 ...

  3. Shadows 使用说明

    1:下载最新版 Windows地址:点击下载 Mac地址:点击下载 2:Windows安装插件(点击下方插件名即可下载) .NET Framework 4.7.2和 Microsoft Visual ...

  4. Python3条件判断

    if语句: Python中if语句的一般形式如下: if condition_1: statement_block_1 elif condition_2: statement_block_2 else ...

  5. Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1)

    Virtual participate 的,D题不会做,打了1:30就打不动了,过了ABCE. A - CME 题意:? 题解:? void test_case() { int n; scanf(&q ...

  6. ansible handlers

    示例:安装nginx --- - hosts: hadoop #指定主机组 remote_user: root #远程执行命令的用户 gather_facts: no #是否获取远程主机的信息 tas ...

  7. 如何查看Linux cpu核数、版本等信息

    CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数 1.查看CPU信息(型号): [root@iZ2ze1rl2qy ...

  8. linux文件管理指令

    总述 所有指令都可以使用--help来查看说明 例如:cat --help -x 表示参数 1.cat:用于打印文件(cat -x filename) 参数: -n:由1开始对每行进行编号 -b:由1 ...

  9. SQLite3中的日期时间函数使用小结

    代码如下: import sqlite3conn = sqlite3.connect('/tmp/sqlite.db')cur = conn.cursor() 接下来干嘛呢?建一张表吧.这里需要注意的 ...

  10. Borg、Omega和Kubernetes:谷歌十几年来从这三个容器管理系统中得到的经验教训 原创: 韩佳瑶 译 Docker 2016-03-23Borg、Omega和Kubernetes:谷歌十几年来从这三个容器管理系统中得到的经验教训 原创: 韩佳瑶 译 Docker 2016-03-23

    Borg.Omega和Kubernetes:谷歌十几年来从这三个容器管理系统中得到的经验教训 原创: 韩佳瑶 译 Docker 2016-03-23