前言
最近学习了一些东西,但是很难一次记录,将分几次记录,近期内容有: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读取,并进行可视化,结果如下:
后语
命运靠自己改变,回报父母!