【GDAL】图像处理三:图像平滑(一)
目的:读取一幅图像中的一个波段,对其进行平滑,采用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的数据类型还是有些疑问。
本文来自博客园,作者:ssh_alitheia,转载请注明原文链接:https://www.cnblogs.com/shanchuan/p/8150360.html