目的:读取一幅图像中的一个波段,对其进行平滑,采用8邻域。
遇到一个问题,没有想好怎么解决。如下:
1.完整代码:
#include <gdal.h>
#include <gdal_priv.h>
#include <iostream>
#include <fstream>
using namespace std;
typedef unsigned char BYTE;
int main()
{
//打开图像
GDALDataset *poDataset;
GDALAllRegister();
poDataset = (GDALDataset *) GDALOpen( "test.bmp", GA_ReadOnly );
if( poDataset == NULL )
{
cout<<"nothing"<<endl;
}
//获取一个光栅波段
GDALRasterBand *poBand;
poBand = poDataset->GetRasterBand( 1 );
cout<<"DataType编号"<<poBand->GetRasterDataType()<<endl;
cout<<"Color Interpretation: "<<poBand->GetColorInterpretation()<<endl;
cout<<"Color Interpretation: "<<GDALGetColorInterpretationName(poBand->GetColorInterpretation())<<endl;
int nImgSizeX = poDataset->GetRasterXSize(); //横向像元个数
int nImgSizeY = poDataset->GetRasterYSize(); //纵向像元个数
int bandcount = poDataset->GetRasterCount(); //波段数
BYTE *pafScan = new BYTE[nImgSizeX * nImgSizeY]; //指向存储数据,一个波段
poBand->RasterIO( GF_Read, 0, 0, nImgSizeX, nImgSizeY,
pafScan, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将一个波段存入pafScan
//Create
GDALDataset *poDstDS;
const char *pszFormat = "BMP";
GDALDriver *poDriver;
poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat); //获取驱动
if( poDriver == NULL )
exit( 1 );
poDstDS = poDriver->Create( "res.bmp", nImgSizeX, nImgSizeY, 1, GDT_Byte, NULL);//创建一个波段的图像
//处理图像
float sumGray = 0;//灰度值之和
for(int i=1; i< nImgSizeY-1; i++) //中心点不包括外面一层
{
for(int j=1; j<nImgSizeX-1; j++)
{
//----------搜索八邻域begin----------
for(int k=-1; k<2; k++)
{
for(int l=-1; l<2; l++)
{
sumGray += pafScan[(i+k)*nImgSizeX + (j+l)];
}
}
//----------搜索八邻域end----------
pafScan[i*nImgSizeX + j] =sumGray / 9.0;
}
}
//分波段存入
poDstDS->GetRasterBand(1)->RasterIO( GF_Write, 0, 0, nImgSizeX, nImgSizeY,
pafScan, nImgSizeX, nImgSizeY, GDT_Byte, 0, 0);//将缓存pafScan中的数据存入结果图像的波段1中
//释放空间
if( poDstDS != NULL )
delete poDstDS;
if(poDataset != NULL )
delete poDataset;
}
但是输出的图像是不正确的:
原图:
读取一个波段后的图像(红波段):
采用上述算法后的结果(有问题)后:
调试后发现问题在于变量sumGray,个人觉得跟存储有关。
2.将搜索八邻域的算法改为如下(不用循环,直接将八邻域列出来,相加):
//----------搜索八邻域begin----------
sumGray = (pafScan[(i-1)*nImgSizeX + j-1] + pafScan[(i-1)*nImgSizeX + j] + pafScan[(i-1)*nImgSizeX + j+1]+
pafScan[i*nImgSizeX + j] + pafScan[i*nImgSizeX + j-1] + pafScan[i*nImgSizeX + j+1] +
pafScan[(i+1)*nImgSizeX + j-1] + pafScan[(i+1)*nImgSizeX + j] + pafScan[(i+1)*nImgSizeX + j+1]);
pafScan[i*nImgSizeX + j] =sumGray / 9.0;
//----------搜索八邻域end----------
输出的结果是正确的,结果如下:
3.或者将搜索八邻域的算法改为如下(先对sumGray赋值一次,后面取平均时除10):
//----------搜索八邻域begin----------
sumGray = pafScan[i*nImgSizeX + j];
for(int k=-1; k<2; k++)
{
for(int l=-1; l<2; l++)
{
sumGray += pafScan[(i+k)*nImgSizeX + (j+l)];
}
}
//----------搜索八邻域end----------
pafScan[i*nImgSizeX + j] =sumGray / 10.0;
输出结果如下:
不清楚那个问题是怎么回事,对gdal的数据类型还是有些疑问。