IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 基于GDAL和Opencv的Tiff数据重采样 -> 正文阅读

[人工智能]基于GDAL和Opencv的Tiff数据重采样

基于GDAL和Opencv的Tiff数据重采样(目标:提高分辨率,实际地理范围不改变),以GByte格式为例

由于GDAL可以很好处理tiff等遥感数据,但重采样函数调用较为麻烦;Opencv在图像重采样等方面具有强大功能,但处理tiff数据流程较为麻烦。因此,本研究拟基于GDAL和Opencv对tiff数据进行重采样,经验证方法可行。


//调用方法
// int nOriX=288; //重采样后tif的像素长col
// int nOriY=266; //重采样后tif的像素宽row
// resizeGByteTiff(nOriX, nOriY, "原始数据.tif", "重采样后数据.tif")


#include "gdal_priv.h"
#include "ogrsf_frmts.h"
#include<opencv2/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp> 
#include<opencv2/highgui.hpp>
using namespace cv;
using namespace std;
void resizeGByteTiff(nOriImgX, nOriImgY, std::string initialTiff, std::string newTiff)
{
	GDALAllRegister();
	//设置支持中文路径
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");

	const char * pszFile = initialTiff.c_str();
	GDALDataset *poDataset = (GDALDataset*)GDALOpen(pszFile, GA_ReadOnly);//使用只读方式打开图像 
	if (!poDataset)
	{
		printf("File: %s不能打开!\n", pszFile);
	}


	//仿射参数
	double padfTransform0[6];
	if (poDataset->GetGeoTransform(padfTransform0) == CE_Failure)
	{
		printf("获取仿射变换参数失败");
	}
	int iImgSizeX0 = poDataset->GetRasterXSize();
	int iImgSizeY0 = poDataset->GetRasterYSize();
	int nCount = poDataset->GetRasterCount(); 	//影像的波段数
	GDALDataType gdal_data_type = poDataset->GetRasterBand(1)->GetRasterDataType();//获取栅格类型
	double dnodata = poDataset->GetRasterBand(1)->GetNoDataValue();//获取空值对应大小
	unsigned char *_pNewValue = new unsigned char[iImgSizeX0*iImgSizeY0];
	poDataset->RasterIO(GF_Read, 0, 0, iImgSizeX0, iImgSizeY0, _pNewValue, iImgSizeX0, iImgSizeY0, gdal_data_type, 1, 0, 0, 0, 0);

	//转化为Mat
	cv::Mat _Mymat(iImgSizeY0, iImgSizeX0, CV_8UC1);
	for (int i = 0; i < iImgSizeX0; i++)
	{
		for (int j = 0; j < iImgSizeY0; j++)
		{
			_Mymat.at<uchar>(j, i) = (uchar)_pNewValue[j * iImgSizeX0 + i];	
		}
	}
    //基于Opencv重采样
	Size dsize = Size(nOriImgX, nOriImgY);
	Mat newMat = Mat(dsize, CV_32S);
	resize(_Mymat, newMat, dsize);
 
    //将重采样后的Mat数据读出
	int a = 0;
	unsigned char* _pimageData = new unsigned char[nOriImgX*nOriImgY];
	for (int i = 0; i < newMat.rows; i++)
	{
		for (int j = 0; j < newMat.cols; j++)
		{
			_pimageData[a] = newMat.at<uchar>(i, j);
			a++;
		}
	}
	
	//缩放:保证大小一致,分辨率增加
	double scale = (double)nOriImgX / iImgSizeX0;
	padfTransform0[1] = padfTransform0[1] / scale;
	scale = (double)nOriImgY / iImgSizeY0;;
	padfTransform0[5] = padfTransform0[5] / scale;

	//写入新的tif	 
	int pBandMap[3] = { 1,2,3 };//定义波段排序顺序
	const char* pszDstFilename = newTiff.c_str();
	GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTiff");
	GDALDataset* poDstDS = poDriver->Create(pszDstFilename, nOriImgX, nOriImgY, nCount, GDT_Byte, NULL);
	poDstDS->SetProjection(poDataset->GetProjectionRef());//给它设置投影
	poDstDS->SetGeoTransform(padfTransform0);//给设置空间转换的六参数
	poDstDS->GetRasterBand(1)->SetNoDataValue(dnodata);//将空值设置为“无数据值”
	//保存影像
	poDstDS->RasterIO(GF_Write, 0, 0, nOriImgX, nOriImgY, _pimageData, nOriImgX, nOriImgY, GDT_Byte, nCount, pBandMap, 0, 0, 0);
	//保存单波段
	poDstDS->GetRasterBand(1)->RasterIO(GF_Write, 0, 0, nOriImgX, nOriImgY, _pimageData, nOriImgX, nOriImgY, GDT_Byte, 0, 0);

	//释放内存
	GDALClose(poDstDS);
	GDALClose(poDataset);
	delete[]_pNewValue;
	delete[]_pimageData;
}
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:31:30  更:2021-10-11 17:34:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 10:29:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码