注册 登录
  • 注册时,本站名称为:RGB空格3S博客,注意中间的空格。
  • 2018.8.14本站全面接入google广告
  • 2017.2.14今天收到45条恶意评论(全是外文),故评论时请填写必要信息,匿名评论全部拉黑,迫不得已而为之
  • 2017.1.27,2017年春节及至,我谨代表本人祝大家新春快乐,本人年终总结文章请访问:2016年终总结
  • 为防止恶意转载,本站全面禁止复制,并添加图片水印:RGB 3S博客www.ixxin.cn。
  • 本站正式更名为RGB 3S博客,本站将撤消所有非3S内容,其将转移到新博客江湖时代

基于C++的GDAL直方图,极值,标准差计算,用Python进行可视化

C/C++ admin 9641次浏览 已收录 2个评论
[隐藏]

前言

最近学习了一些东西,但是很难一次记录,将分几次记录,近期内容有:GDAL获取图像基本信息,基于RasterIO的图像重采样,基于SUFT算法的图像自动匹配并自动进行仿射变换(网上未搜到相关教程),以上是已经基本实现了,接下来这个周末打算实现图像融合,初步打算要么IHS要么基于高通滤波的算法,fighting!!!除了C++之外,还打算把之前写的Python小工具分享出来。
本次除了进行直方图统计之外,还编写了Python代码进行可视化。

代码

/*
作者:山科_xxin
时间:2017-03-24 23:07:18
功能:直方图,极值,标准差计算
类别:<a href="https://www.ixxin.cn/tag/gdal/" title="查看更多关于GDAL的文章" target="_blank">GDAL</a>练习
*/
#include<gdal_priv.h>
#include<iostream>
#include<string>
#include<stdlib.h>
#include<cpl_conv.h>
#include<cpl_port.h>
#include<fstream>
using namespace std;
int Histogram(GDALDataset *poD)
{
	GDALRasterBand  *pBand;
	int nbands = poD->GetRasterCount();

	int n ;
	cout<<"共"<<nbands<<"个波段,请输入您想要统计的波段:"<<endl;
	cin>>n;
	cout<<n<<endl;
	if(n<1||n>nbands)
	{
		cout<<"输入有误"<<endl;
	}

	pBand = poD->GetRasterBand(n);
	GDALDataType eDT = pBand->GetRasterDataType();
	int f;
	if(eDT == GDT_Byte )
	{
		f = 256;
	}
	else
	{
		cout<<"暂不支持";
		system("pause");
		exit(1);
	}
	int e = 1;
	
	GUIntBig *PanHis = new GUIntBig[f];
	
	pBand->GetHistogram(-0.5,255.5,f/e,PanHis,TRUE,FALSE,NULL,NULL);

	int j = -1;
	int i = 0;

	const char *Path = "G:\\opencv\\his.txt";
	ofstream SaveHis(Path);

	for(i;i<f;i+=e)
	{
		j++;
		cout<<i<<"-"<<i+e<<":"<<PanHis[j]<<endl;
		SaveHis<<i<<" "<<PanHis[j]<<endl;
		
	}
	SaveHis.close();
	if((j*(e+1))+1<f)
	{
		cout<<i<<"-"<<f<<":"<<PanHis[j]<<endl;
	}

	double MinMax[2] = {0.0};
	pBand->ComputeRasterMinMax(TRUE,MinMax);
	cout<<"最小值是:"<<MinMax[0]<<endl;
	cout<<"最大值是:"<<MinMax[1]<<endl;
	//double pdfMean = (MinMax[0]+MinMax[1])/2;
	double Max;
	double Min;
	double pdfMean;
	double pdfStdDev;
	pBand->ComputeStatistics(TRUE,&Min,&Max,&pdfMean,&pdfStdDev,NULL,NULL);
	cout<<"标准差:"<<pdfStdDev<<endl;
	return 0;
}

int main()
{
	const char *pszFilename = "G:\\gdalwork\\image\\test.jpg";
	GDALDataset *poD;
	//GDALRasterBand *BandD;
	GDALAllRegister();
	poD = (GDALDataset*)GDALOpen(pszFilename,GA_ReadOnly);

	//GetInfo(poD);
	//resamp(poD,30,30);
	Histogram(poD);
	system("pause");
	return 0;
}

以上代码主要是统计各种值,并把直方图的值写入到一个文本文件,接下来就是用Python读取,并进行可视化,结果如下:
his

后语

命运靠自己改变,回报父母!


xxin blog , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明基于C++的GDAL直方图,极值,标准差计算,用Python进行可视化
喜欢 (3)
支付宝[853060844@qq.com]
分享 (0)
admin
关于作者:
坐标山科大遥感系小鲜肉一枚。
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 感觉不错哦,认真拜读咯!
    增达网QQ-560815252017-03-26 10:29 回复 Windows 7 | 搜狗浏览器 2.X
  2. 感觉不错哦,认真拜读咯!
    增达网QQ-585963482017-03-26 13:17 回复 Windows 7 | 搜狗浏览器 2.X