简介
从这个博主的文章:
https://blog.csdn.net/shanchuan2012/article/details/24742475
借鉴了一下关于灰度图像的平滑的算法,所谓灰度图像就是只有一个波段的图像,那么真彩色(三波段)图像的处理也类似,不过是要对三个波段都执行一下平滑算法。
不多说:直接上代码:
处理函数代码
bool smoothform::smoothraster()
{
//打开图像
GDALDataset *poDataset;
GDALAllRegister();
poDataset = (GDALDataset *) GDALOpen(ui->lineEdit->text().toStdString().c_str(),GA_ReadOnly);
if(poDataset == nullptr)
{
//反馈代码
}
//获取一个光栅波段
QList<GDALRasterBand*> bandList;
bandList.append(poDataset->GetRasterBand(1));
bandList.append(poDataset->GetRasterBand(2));
bandList.append(poDataset->GetRasterBand(3));
int nImgSizeX = poDataset->GetRasterXSize(); //横向像元个数
int nImgSizeY = poDataset->GetRasterYSize(); //纵向像元个数
int bandcount = poDataset->GetRasterCount(); //波段数
BYTE *rband = new BYTE[nImgSizeX * nImgSizeY]; //指向存储数据,一个波段
BYTE *gband = new BYTE[nImgSizeX * nImgSizeY];
BYTE *bband = new BYTE[nImgSizeX * nImgSizeY];
bandList[0]->RasterIO( GF_Read, 0, 0, nImgSizeX, nImgSizeY,
rband, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将一个波段存入pafScan
bandList[1]->RasterIO( GF_Read, 0, 0, nImgSizeX, nImgSizeY,
gband, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将一个波段存入pafScan
bandList[2]->RasterIO( GF_Read, 0, 0, nImgSizeX, nImgSizeY,
bband, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将一个波段存入pafScan
//Create
GDALDataset *poDstDS;
const char *pszFormat = "BMP";
GDALDriver *poDriver;
poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat); //获取驱动
if( poDriver == nullptr )
exit( 1 );
poDstDS = poDriver->Create( ui->lineEdit_2->text().toStdString().c_str(), nImgSizeX, nImgSizeY, 3, GDT_Byte, NULL);//创建一个图像
//处理图像rband
float sumGray = 0;//灰度值之和
for(int i=1; i< nImgSizeY-1; i++) //中心点不包括外面一层
{
for(int j=1; j<nImgSizeX-1; j++)
{
//----------搜索八邻域begin----------
sumGray = rband[i*nImgSizeX + j];
for(int k=-1; k<2; k++)
{
for(int l=-1; l<2; l++)
{
sumGray += rband[(i+k)*nImgSizeX + (j+l)];
}
}
//----------搜索八邻域end----------
rband[i*nImgSizeX + j] =sumGray / 10.0;
}
}
//处理图像gband
sumGray = 0;//灰度值之和
for(int i=1; i< nImgSizeY-1; i++) //中心点不包括外面一层
{
for(int j=1; j<nImgSizeX-1; j++)
{
//----------搜索八邻域begin----------
sumGray = gband[i*nImgSizeX + j];
for(int k=-1; k<2; k++)
{
for(int l=-1; l<2; l++)
{
sumGray += gband[(i+k)*nImgSizeX + (j+l)];
}
}
//----------搜索八邻域end----------
gband[i*nImgSizeX + j] =sumGray / 10.0;
}
}
//处理图像bband
sumGray = 0;//灰度值之和
for(int i=1; i< nImgSizeY-1; i++) //中心点不包括外面一层
{
for(int j=1; j<nImgSizeX-1; j++)
{
//----------搜索八邻域begin----------
sumGray = bband[i*nImgSizeX + j];
for(int k=-1; k<2; k++)
{
for(int l=-1; l<2; l++)
{
sumGray += bband[(i+k)*nImgSizeX + (j+l)];
}
}
//----------搜索八邻域end----------
bband[i*nImgSizeX + j] =sumGray / 10.0;
}
}
//分波段存入
poDstDS->GetRasterBand(1)->RasterIO( GF_Write, 0, 0, nImgSizeX, nImgSizeY,
rband, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将缓存pafScan中的数据存入结果图像的波段1中
poDstDS->GetRasterBand(2)->RasterIO( GF_Write, 0, 0, nImgSizeX, nImgSizeY,
gband, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将缓存pafScan中的数据存入结果图像的波段2中
poDstDS->GetRasterBand(3)->RasterIO( GF_Write, 0, 0, nImgSizeX, nImgSizeY,
bband, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将缓存pafScan中的数据存入结果图像的波段3中
//释放空间
if( poDstDS != NULL )
delete poDstDS;
if(poDataset != NULL )
delete poDataset;
return true;
}