资源简介
原料:C++、gdal
功能:读取影像数据,计算其对比度,可适用于多波段遥感影像。
算法:各中心像素灰度值与周围4近邻像素灰度值求差,取平方求和,再除以参与求差运算的次数。内容包含(CContrast.h+CContrast.cpp+main.cpp),输入影像路径可直接运行,输出影像对比度计算结果,高效快捷。

代码片段和文件信息
#include “CContrast.h“
/*
41\42\43行要修改,输入nBandCount波段数的实际值,不然报错
*/
CContrast::CContrast()
{
}
CContrast::~CContrast()
{
}
float * CContrast::contrast(string path)
{
//path: 输入影像路径;
//1. 读取影像获取影像信息
GDALDataset *poDataset1;//GDAL数据集
//GDALDriver *poDriver1;//GDAL驱动用于创建新的文件
GDALAllRegister();
poDataset1 = (GDALDataset*)GDALOpen(path.c_str() GA_ReadOnly);
//确认影像是否读入
if (poDataset1 == NULL)
{
cout << “影像打开失败!“ << endl;
}
else {
cout << “影像打开成功!“ << endl;
}
//获取影像的长、宽、波段数及投影信息
int nBandCount = poDataset1->GetRasterCount();
int nImgSizeX = poDataset1->GetRasterXSize();
int nImgSizeY = poDataset1->GetRasterYSize();
//申请内存空间
float* pBuf1 = new float[nImgSizeX * nImgSizeY * nBandCount];
memset(pBuf1 0 nImgSizeX * nImgSizeY * nBandCount * sizeof(float));
int num[nBandCount] = { 0 }; //输入nBandCount波段数的实际值,不然报错
float sum[nBandCount] = { 0.0 };//输入nBandCount波段数的实际值,不然报错
float *contrast = new float[nBandCount];//输入nBandCount波段数的实际值,不然报错
memset(contrast 0 nBandCount * sizeof(float));
//读取当前数据
poDataset1->RasterIO(GF_Read 0 0 nImgSizeX nImgSizeY pBuf1 nImgSizeX nImgSizeY GDT_Float32 nBandCount 0 0 0 0);
//图像的上下左右边界均向外扩充+1
//申请内存空间
float* pBuf2 = new float[(nImgSizeX+2) * (nImgSizeY+2) * nBandCount];
memset(pBuf2 0 (nImgSizeX + 2) * (nImgSizeY + 2) * nBandCount * sizeof(float));
int i j;
for (int nnum = 0; nnum < nBandCount; nnum++)
{
for (j = 0; j {
if (j == 0)
{
for (i = 1; i {
float* pData10 = pBuf2 + nnum*(nImgSizeX + 2)*(nImgSizeY + 2) + j*(nImgSizeX + 2) + i;
float* pData11 = pBuf1 + nnum*nImgSizeX*nImgSizeY + j*nImgSizeX + i-1;
*pData10 = *pData11;
}
}
else if (j == nImgSizeY + 1) //pSrc倒数第二行的值赋给pBuf1 的倒数第一行
{
for (i = 1; i {
float* pData20 = pBuf2 + nnum*(nImgSizeX + 2)*(nImgSizeY + 2) + j*(nImgSizeX + 2) + i;
float* pData21 = pBuf1 + nnum*nImgSizeX*nImgSizeY + (j-2)*nImgSizeX + i - 1;
*pData20 = *pData21;
}
}
else
{
for (i = 0; i {
if (i == 0) //pSrc第二列的值赋给pBuf1 的第一列
{
float* pData30 = pBuf2+ nnum*(nImgSizeX + 2)*(nImgSizeY + 2) + j*(nImgSizeX + 2) + i;
float* pData31 = pBuf1 + nnum*nImgSizeX*nImgSizeY + (j-1)*nImgSizeX + i ;
*pData30 = *pData31;
}
else if (i == nImgSizeX + 1)
{
float* pData40 = pBuf2 + nnum*(nImgSizeX + 2)*(nImgSizeY + 2) + j*(nImgSizeX + 2) + i;
float* pData41 = pBuf1 + nnum*nImgSizeX*nImgSizeY + (j - 1)*nImgSizeX + i-2;
*pData40 = *pData41;
}
else
{
float* pData50 = pBuf2 + nnum*(nImgSizeX + 2)*(nImgSizeY + 2) + j*(nImgSizeX + 2) + i;
float* pData51 = pBuf1 + nnum*nImgSizeX*nImgSizeY + (j - 1)*nImgSizeX + i-1;
*pData50 = *pData51;
}
}
}
}
}
////对当前数据进行处理
for (int nnum
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4333 2020-08-19 17:43 Contrast\CContrast.cpp
文件 240 2020-08-18 22:47 Contrast\CContrast.h
文件 378 2020-08-19 17:39 Contrast\main.cpp
- 上一篇:快递系统源代码
- 下一篇:GOC京东物流车辆调度A榜赛题,C++代码
相关资源
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
- VC++基于OpenGL模拟的一个3维空间模型
评论
共有 条评论