c++下使用Gdal进行图像相减

5 篇文章 0 订阅
4 篇文章 0 订阅

【软件名称及版本】:vs2019,gdal4.x

打包成函数即可使用

GDALAllRegister(); //注册驱动
	GDALDataset* poSrcDS;//建立数据集读第一张图片
	poSrcDS = (GDALDataset*)GDALOpen(filepath1, GA_ReadOnly);//指针指向文件路径
	if (poSrcDS == NULL)
	{
		cout << "open file error!" << endl;
	}
	else
		iXSizeDS = poSrcDS->GetRasterXSize();//获取图像的宽
	int iYSizeDS = poSrcDS->GetRasterYSize();//获取图像的高
	int iBandCountDS = poSrcDS->GetRasterCount();//获取图像的波段数

	GDALDataset* poSrcDF;//建立数据集读第二张图片
	poSrcDF = (GDALDataset*)GDALOpen(filepath2, GA_ReadOnly);//指针指向文件路径
	if (poSrcDF == NULL)
	{
		cout << "open file error!" << endl;
	}
	else
		iXSizeDF = poSrcDF->GetRasterXSize();//获取图像的宽
	int iYSizeDF = poSrcDF->GetRasterYSize();//获取图像的高
	int iBandCountDF = poSrcDF->GetRasterCount();//获取图像的波段数

	GDALDriver* poDriver;
	GDALDataset* poDstDS;
	const char* pszFormat = "GTiff";
	const char* pszDstFile = "NewPic.tiff";
	poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
	poDstDS = poDriver->Create(pszDstFile, iXSizeDS, iYSizeDS, iBandCountDS, GDT_Byte, NULL);//创建文件用来写入计算后的数据

	int* pSrcData = new int[iXSizeDS * iYSizeDS];//创建指针存第一张图片的数据
	int* pDstData = new int[iXSizeDS * iYSizeDS];//创建指针存结果图像的数据
	int* pFrcData = new int[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_Byte, 0, 0);
				pSrcBandDF->RasterIO(GF_Read, 0, i, iXSizeDS, 1, pFrcData, iXSizeDS, 1, GDT_Byte, 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_Byte, 0, 0);//把数据存入pDstData
				}
			}
		}
	}

	GDALClose((GDALDatasetH)poSrcDS);//关闭第一张图片
	GDALClose((GDALDatasetH)poSrcDF);//关闭第二张图片
	GDALClose((GDALDatasetH)poDstDS);//关闭结果图片
	delete[]pSrcData;
	delete[]pFrcData;
	delete[]pDstData;

【鸣谢】:https://bbs.csdn.net/topics/390873719
还有momo前辈

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值