c++中使用GDAL将两张影像相减

void image_process::do_diff(int master_date, int slave_date, string img_path, string out_path)
{

	img_path.append("\\");
	out_path.append("\\");
	string filepath1 = img_path + to_string(master_date) + ".tif";
	string filepath2 = img_path + to_string(slave_date) + ".tif";

	GDALAllRegister(); //注册驱动
	GDALDataset* poSrcDS;//建立数据集读第一张图片
	poSrcDS = (GDALDataset*)GDALOpen(filepath1.c_str(), GA_ReadOnly);//指针指向文件路径
	if (poSrcDS == NULL)
	{
		cout << "open file error!" << endl;
	}

	int	iXSizeDS = poSrcDS->GetRasterXSize();//获取图像的宽
	int iYSizeDS = poSrcDS->GetRasterYSize();//获取图像的高
	int iBandCountDS = poSrcDS->GetRasterCount();//获取图像的波段数

	GDALDataset* poSrcDF;//建立数据集读第二张图片
	poSrcDF = (GDALDataset*)GDALOpen(filepath2.c_str(), GA_ReadOnly);//指针指向文件路径
	if (poSrcDF == NULL)
	{
		cout << "open file error!" << endl;
	}

	int	iXSizeDF = poSrcDF->GetRasterXSize();//获取图像的宽
	int iYSizeDF = poSrcDF->GetRasterYSize();//获取图像的高
	int iBandCountDF = poSrcDF->GetRasterCount();//获取图像的波段数

	GDALDriver* poDriver;
	GDALDataset* poDstDS;
	const char* pszFormat = "GTiff";
	//const char* pszDstFile = "NewPic.tiff";
	string pszDstFile = out_path + to_string(master_date) + "-" + to_string(slave_date) + ".ztd.tif";
	poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
	poDstDS = poDriver->Create(pszDstFile.c_str(), iXSizeDS, iYSizeDS, iBandCountDS, GDT_Float32, NULL);//创建文件用来写入计算后的数据
	double value[6];
	poSrcDF->GetGeoTransform(value);
	poDstDS->SetGeoTransform(value);
	float* pSrcData = new float[iXSizeDS * iYSizeDS];//创建指针存第一张图片的数据
	float* pDstData = new float[iXSizeDS * iYSizeDS];//创建指针存结果图像的数据
	float* pFrcData = new float[iXSizeDS * iYSizeDS];//创建指针存第二张图片的数据


	if (iXSizeDS == iXSizeDF && iYSizeDS == iYSizeDF && iBandCountDS == iBandCountDF)//鲁棒
	{

		//循环波段,按波段来读写图像
		for (int iBand = 1; iBand <= iBandCountDS; iBand++)
		{
			GDALRasterBand* pSrcBandDS = poSrcDS->GetRasterBand(iBand);//获取第一张图片的第iBand个波段
			GDALRasterBand* pSrcBandDF = poSrcDF->GetRasterBand(iBand);//获取第二张图片的第iBand个波段
			GDALRasterBand* pDstBand = poDstDS->GetRasterBand(iBand);
			for (int i = 0; i < iYSizeDS; i++)//循环图像高
			{
				pSrcBandDS->RasterIO(GF_Read, 0, i, iXSizeDS, 1, pSrcData, iXSizeDS, 1, GDT_Float32, 0, 0);
				pSrcBandDF->RasterIO(GF_Read, 0, i, iXSizeDS, 1, pFrcData, iXSizeDS, 1, GDT_Float32, 0, 0);
				for (int j = 0; j < iXSizeDS; j++)//循环图像宽
				{
					pDstData[j] = pSrcData[j] - pFrcData[j];
					pDstBand->RasterIO(GF_Write, 0, i, iXSizeDS, 1, pDstData, iXSizeDS, 1, GDT_Float32, 0, 0);//把数据存入pDstData
				}
			}
		}
	}
	
	GDALClose((GDALDatasetH)poSrcDS);//关闭第一张图片
	GDALClose((GDALDatasetH)poSrcDF);//关闭第二张图片
	GDALClose((GDALDatasetH)poDstDS);//关闭结果图片
	delete[]pSrcData;
	delete[]pFrcData;
	delete[]pDstData;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扎不下村村长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值