OpenCV各种遥感指数计算

植被指数

比值被指数

OpenCV各种遥感指数计算_第1张图片

归一化植被指数

OpenCV各种遥感指数计算_第2张图片

土壤调节植被指数

OpenCV各种遥感指数计算_第3张图片

修正的土壤调节植被指数

OpenCV各种遥感指数计算_第4张图片

三波段梯度差植被指数

OpenCV各种遥感指数计算_第5张图片

水体指数

归一化水体指数

OpenCV各种遥感指数计算_第6张图片

MNDWI

OpenCV各种遥感指数计算_第7张图片

AWEI

OpenCV各种遥感指数计算_第8张图片

EWI

OpenCV各种遥感指数计算_第9张图片

NWI

OpenCV各种遥感指数计算_第10张图片

OpenCV各种遥感指数计算_第11张图片

建筑指数

DBI

OpenCV各种遥感指数计算_第12张图片

NDBI

OpenCV各种遥感指数计算_第13张图片

IBI

OpenCV各种遥感指数计算_第14张图片

归一化差值裸地与建筑用地指数

OpenCV各种遥感指数计算_第15张图片

裸土指数

OpenCV各种遥感指数计算_第16张图片

代码

#include 
#include 
#include 
using namespace std;
using namespace cv;

//植被指数计算

void RVI(const Mat &nir, const Mat &r,Mat &rvi)
{
	divide(nir, r, rvi,1,CV_32F);
}

void NDVI(const Mat &nir, const Mat &r, Mat &ndvi)
{
	divide(nir - r, nir + r, ndvi, 1, CV_32F);
}

void SAVI(const Mat &nir, const Mat &r, double L,Mat &savi)
{
	divide((nir - r)*(1 + L), nir + r + L, savi, 1, CV_32F);
}

void MSAVI(const Mat &nir,const Mat &r,Mat &msavi)
{
	Mat tmp1, tmp2,tmp3;
	pow(2 * nir + 1, 2, tmp1);
	tmp2 = tmp1 - 8 * (nir - r);
	tmp2.convertTo(tmp2, CV_32F);
	pow(tmp2, 0.5, tmp3);
	subtract(2 * nir + 1, tmp3, msavi, noArray(), CV_32F);
	msavi *= 0.5;
	return;
}

//水体指数计算
void NDWI(const Mat &nir, const Mat &g, Mat & ndwi)
{
	divide(g - nir, g + nir, ndwi, 1, CV_32F);
}

void MNDWI(const Mat &swir, const Mat &g, Mat &mndwi)
{
	divide(g - swir, g + swir, mndwi, 1, CV_32F);
}


//建筑指数计算
void DBI(const Mat &mir, const Mat & nir, Mat & dbi)
{
	dbi = mir - nir;
}

void NDBI(const Mat &swir, const Mat &nir, Mat & ndbi)
{
	divide(swir - nir, swir + nir, ndbi, 1, CV_32F);
}

//OTSU 阈值分割
void OTSUSegmentation(const Mat & input, Mat & output, double &value)
{
	double minv, maxv;
	minMaxLoc(input, &minv, &maxv);
	Mat tmp;
	divide(input - minv, maxv - minv, tmp, 1, CV_32F);
	tmp = tmp * 255;
	tmp.convertTo(tmp, CV_8U);
	value = threshold(tmp, output, 128, 255, ThresholdTypes::THRESH_BINARY | ThresholdTypes::THRESH_OTSU);
	value /= 255;
	value = value * (maxv - minv) + minv;
}

int main()
{
	Mat nir = imread("./tifs/tm4.tif", ImreadModes::IMREAD_GRAYSCALE);
	Mat r = imread("./tifs/tm3.tif", ImreadModes::IMREAD_GRAYSCALE);
	Mat swir = imread("./tifs/tm5.tif", ImreadModes::IMREAD_GRAYSCALE);
	Mat b= imread("./tifs/tm1.tif", ImreadModes::IMREAD_GRAYSCALE);
	Mat g=imread("./tifs/tm2.tif", ImreadModes::IMREAD_GRAYSCALE);
	Mat mir= imread("./tifs/tm7.tif", ImreadModes::IMREAD_GRAYSCALE);
	Mat rvi;
	RVI(nir, r, rvi);
	imwrite("./tifs/rvi.tif", rvi);
	Mat rviArea;
	double rviV;
	OTSUSegmentation(rvi, rviArea, rviV);
	imwrite("./tifs/rviArea.tif", rviArea);
	cout << "rvi阈值:" << rviV << endl;
	Mat ndvi;
	NDVI(nir, r, ndvi);
	imwrite("./tifs/ndvi.tif", ndvi);
	Mat ndviArea;
	double ndviV;
	OTSUSegmentation(ndvi, ndviArea, ndviV);
	imwrite("./tifs/ndviArea.tif", ndviArea);
	cout << "ndvi阈值:" << ndviV << endl;
	Mat savi;
	SAVI(nir, r, 0.5,savi);
	imwrite("./tifs/savi.tif", savi);
	Mat saviArea;
	double saviV;
	OTSUSegmentation(savi,saviArea,saviV);
	imwrite("./tifs/saviArea.tif", saviArea);
	cout << "savi阈值:" << saviV << endl;
	Mat msavi;
	MSAVI(nir, r,msavi);
	imwrite("./tifs/msavi.tif", msavi);
	Mat msaviArea;
	double msaviV;
	OTSUSegmentation(msavi, msaviArea, msaviV);
	imwrite("./tifs/msaviArea.tif", msaviArea);
	cout << "msavi阈值:" << msaviV << endl;
	Mat ndwi;
	NDWI(nir, g,ndwi);
	imwrite("./tifs/ndwi.tif", ndwi);
	Mat ndwiArea;
	double ndwiV;
	OTSUSegmentation(ndwi, ndwiArea, ndwiV);
	imwrite("./tifs/ndwiArea.tif",ndwiArea);
	cout << "ndwi阈值:" << ndwiV << endl;
	Mat mndwi;
	MNDWI(swir, g, mndwi);
	imwrite("./tifs/mndwi.tif", mndwi);
	Mat mndwiArea;
	double mndwiV;
	OTSUSegmentation(mndwi, mndwiArea, mndwiV);
	imwrite("./tifs/mndwiArea.tif", mndwiArea);
	cout << "mndwi阈值:" << mndwiV << endl;
	Mat dbi;
	DBI(mir, nir, dbi);
	imwrite("./tifs/dbi.tif", dbi);
	Mat dbiArea;
	double dbiV;
	OTSUSegmentation(dbi, dbiArea, dbiV);
	imwrite("./tifs/dbiArea.tif", dbiArea);
	cout << "dbi阈值:" << dbiV << endl;
	Mat ndbi;
	NDBI(swir, nir, ndbi);
	imwrite("./tifs/ndbi.tif", ndbi);
	Mat ndbiArea;
	double ndbiV;
	OTSUSegmentation(ndbi, ndbiArea, ndbiV);
	imwrite("./tifs/ndbiArea.tif", ndbiArea);
	cout << "dbi阈值:" << ndbiV << endl;
	system("pause");
	return 0;
}

结果

ndvi

OpenCV各种遥感指数计算_第17张图片

nvdi阈值分割

OpenCV各种遥感指数计算_第18张图片

rvi

OpenCV各种遥感指数计算_第19张图片

rvi阈值分割

OpenCV各种遥感指数计算_第20张图片

savi

OpenCV各种遥感指数计算_第21张图片

savi阈值分割

OpenCV各种遥感指数计算_第22张图片

msavi

OpenCV各种遥感指数计算_第23张图片

msavi阈值分割

OpenCV各种遥感指数计算_第24张图片

ndwi

OpenCV各种遥感指数计算_第25张图片

ndwi阈值分割

OpenCV各种遥感指数计算_第26张图片

mndwi

OpenCV各种遥感指数计算_第27张图片

mndwi阈值分割

OpenCV各种遥感指数计算_第28张图片

dbi

OpenCV各种遥感指数计算_第29张图片

dbi阈值分割

OpenCV各种遥感指数计算_第30张图片

ndbi

OpenCV各种遥感指数计算_第31张图片

ndbi阈值分割

OpenCV各种遥感指数计算_第32张图片

分割阈值输出

OpenCV各种遥感指数计算_第33张图片

你可能感兴趣的:(遥感与图像处理,opencv,计算机视觉,c++,遥感,图像处理)