前言
最近学习了一些东西,但是很难一次记录,将分几次记录,近期内容有:GDAL获取图像基本信息,基于RasterIO的图像重采样,基于SUFT算法的图像自动匹配并自动进行仿射变换(网上未搜到相关教程),以上是已经基本实现了,接下来这个周末打算实现图像融合,初步打算要么IHS要么基于高通滤波的算法,fighting!!!除了C++之外,还打算把之前写的Python小工具分享出来。
本次除了进行直方图统计之外,还编写了Python代码进行可视化。
代码
/*
作者:山科_xxin
时间:2017-03-24 23:07:18
功能:直方图,极值,标准差计算
类别:GDAL练习
*/
#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读取,并进行可视化,结果如下:

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



