バンド分離はGDALを使用して実行しました

最も一般的には、より多くの仕事を完了することができない分離帯の特定の数よりも、このようなバンドとして、バンドに直接単離することができるOpenCVの分割方法を使用して、帯域分割またはOpenCVのに使用され、良好な結果が、限られたデータ帯域を扱うことができるという問題がありますまたはデータの損失があるので、我々は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の帯域分離

リモートセンシング画像は、一般的に複数のバンドを持っているため、サブバンドデータの処理は、より一般的な方法であるが、本明細書中で使用される、帯域分離のためのGDALのでOpenCVのを満たすことができない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リンクをダウンロードするには、no統合CSDNの場合は、使用することができますブログパークがリンク直接ダウンロードできません。そこにまた、唯一の基本的なソースコード、関連するdllファイルのブログパークをコピーCSDNのすべてですので、このブログの公園はあなたが本当にソースコードではなく、具体的な手順を必要とし、いずれにせよ、非常に小さいことに注意してくださいプロジェクト。

おすすめ

転載: www.cnblogs.com/muxuan/p/gdal_band_split.html