高斯低通滤波及图像锐化

滤波是图像中常用的处理方法,如常见的均值滤波、中值滤波、双边滤波以及高斯滤波等。本博客主要使用高斯滤波,并在此基础上对图像进行锐化处理。至于高斯低通滤波的原理,在此不再累述,网上很多也很详细。

高斯低通滤波是对图像做平滑处理,那我怎么说还能够做图像锐化呢?因为,原始的图像 + 原始图像 -  高斯低通滤波后的图像  = 锐化后的图像。很自然的道理,不再累述,直接上代码,以下是用在了16位的遥感影像上,采用GDAL库读取影像。


bool GaussLowFilter( const char *inFilename,const char *smoothedFilename,const char *pszFormat,double dSigma )
{
	GDALAllRegister();
	
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");      //为了支持中文路径
	GDALDataset *poIn = (GDALDataset *)GDALOpen(inFilename,GA_ReadOnly);   //打开影像
	//获取影像大小
	int InXsize = poIn ->GetRasterXSize();
	int InYsize = poIn ->GetRasterYSize();
	//获取影像波段数
	int InBands = poIn ->GetRasterCount();
	//获取影像格式
	GDALDataType eDataType = poIn -> GetRasterBand(1) -> GetRasterDataType();
	//定义存储影像的空间参考数组
	double adfInGeoTransform[6] = {0};
	const char *pszWKT = NULL;
	//获取影像空间参考
	poIn ->GetGeoTransform(adfInGeoTransform);
	pszWKT = poIn ->GetProjectionRef();

	printf("Image gaussian filtering ...");

	switch (eDataType)
	{
	case GDT_UInt16:
		{
			//创建平滑后文件
			GDALDriver *poDriver = (GDALDriver *)GDALGetDriverByName(pszFormat);
			GDALDataset *poOutputDS = poDriver -> Create(smoothedFilename,InXsize,InYsize,InBands,eDataType,NULL);

			//设置平滑后图像的空间参考以及地理坐标
			poOutputDS -> SetGeoTransform(adfInGeoTransform);
			poOutputDS -> SetProjection(pszWKT);

			uint16_t *InData = (uint16_t *)malloc(sizeof(uint16_t) *InXsize * InYsize *InBands);
			memset(InData,0,sizeof(uint16_t ) * InBands * InXsize * InYsize);
			for(int iBand = 0; iBand < InBands; iBand++ )
			{
				//读取多光谱影像到缓存
				poIn ->GetRasterBand( iBand + 1) -> RasterIO( GF_Read, 0, 0, InXsize, InYsize , InData + iBand * InXsize * InYsize,InXsize,InYsize, GDT_UInt16, 0, 0 );
			}

			//高斯低通滤波
			int nWidowSize = (int)(1 + 2*ceil(3*dSigma));  //定义滤波窗口大小
			int nCenter = (nWidowSize)/2;                  //定义滤波窗口中心索引

			//生成二维的高斯滤波系数
			double *pdKernal = (double *)malloc(sizeof(double) * nWidowSize * nWidowSize);       
	//		double *pdKernal = new double [nWidowSize * nWidowSize];   //定义高斯核数组
			double dSum = 0.0;                                         //求和,进行归一化
			
			for(int i = 0;i < nWidowSize; i++)
			{
				for(int j = 0; j < nWidowSize; j++)
				{
					int nDis_x = i - nCenter;
					int nDis_y = j - nCenter;
					pdKernal[i+j*nWidowSize]=exp(-(1/2)*(nDis_x*nDis_x+nDis_y*nDis_y)    //窗口每个的权值
											/(dSigma*dSigma))/(2*3.1415926*dSigma*dSigma);  
					dSum += pdKernal[i+j*nWidowSize]; 
				}
			}
						//进行归一化  
			for(int i=0; i InYsize - nWidowSize || j > InXsize - nWidowSize)
						{
							*(smoothedData + iBand * InXsize * InYsize + i * InXsize + j ) = ImageData_tem;
						}
						else
						{
							double dFilter=0.0;  
							double dSum = 0.0;  
							double dmeanWin = 0;
							for(int x=(-nCenter); x<=nCenter; x++)           //行  
							{  
								for(int y=(-nCenter); y<=nCenter; y++)       //列  
								{  
									if( (j+x)>=0 && (j+x)=0 && (i+y) 60000)
											dfTemp = 0;

							uint16_t Inpix = *(InData + iBand * InXsize * InYsize + i * InXsize + j );
							//	*(smoothedData + iBand * InXsize * InYsize + i * InXsize + j ) = dfTemp ;      //滤波结果

							//           ________________*  对影像进行锐化处理   *__________________
							if (Inpix < dfTemp)
							{
								*(smoothedData + iBand * InXsize * InYsize + i * InXsize + j ) = Inpix;
							}
							else if (2*Inpix - dfTemp < 60000)
							{
								*(smoothedData + iBand * InXsize * InYsize + i * InXsize + j ) = 2*Inpix - dfTemp ;
							}
							else
								*(smoothedData + iBand * InXsize * InYsize + i * InXsize + j ) = 0 ;
							//          ________________* ---------------------  *___________________
						}
										 
					} 
				}  

		     }
			for( int iBand = 0; iBand < InBands; iBand ++)
			{
				poOutputDS -> GetRasterBand( iBand + 1) -> RasterIO( GF_Write ,0,0,InXsize,InYsize,smoothedData + iBand * InXsize * InYsize,InXsize,InYsize,GDT_UInt16,0,0);
			}

			free(pdKernal);
			free(InData);
			free(smoothedData);

			GDALClose(poIn);
			GDALClose(poOutputDS);
			break;
		}
	}
	return true;
}


 
  

你可能感兴趣的:(RS,&,GIS,经验)