资源简介

原料: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

评论

共有 条评论