资源简介
原料: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++代码
相关资源
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
- VC++基于OpenGL模拟的一个3维空间模型
- c++ 虚拟摄像头
- hook,捕获所有案件,查找所有窗口,
- C语言课设计算器
- c++ 简易贪吃蛇源码
- 高精度加法(c++代码)
- C++调用百度地图案例
- 北京化工大学计算方法(C/C++)讲义
- 基于VC++的SolidWorks二次开发SolidWorks
- c++ 模拟鼠标按键
- OFD编辑器
- Beginning C++17 From Novice to Professional
- C++ STL实现
- opencv手部轮廓识别以及轨迹识别
- 百度C++编码规范
- C++ sql2008 WebServer通讯.docx
- c++ 定时关机程序源码
- 基于VSCode和CMake实现C++开发
- c++语法查询工具
- c++ 账务系统源码
- GBT 28169-2011 嵌入式软件 C语言编码规范
- c++ 猜拳小游戏
- XUnZip Zip解压缩.rar
评论
共有 条评论