图像处理系列——图像融合之高通滤波(HPF)

前话不多说,直接进入主题。

一、基于高通滤波融合算法原理

HPF融合算法原理其实就是将高空间分辨率全色影像中的高频信息(细节、边缘)叠加到低分辨率多光谱影像上。其处理流程如下图所示,先将高分辨率全色影像与低分辨率多光谱影像进行直方图匹配;再利用高通滤波器提取出直方图匹配后全色影像的高频分量,低频信息大部分被滤除;最后将提取的高频信息加入到低分辨率多光谱影像中,即可形成分辨率较高且纹理细节突出的多光谱融合影像。

图像处理系列——图像融合之高通滤波(HPF)_第1张图片

基于高通滤波的融合算法的数学表达式为:

二、HPF融合算法特点

HPF融合算法操作简单,对影像波段数没有限制,但是由于是通过高通滤波对高分辨率全色影像进行处理,得到的分量将会损失影像中大量重要的细节纹理信息。因而通过该算法得到的融合影像主要是用于后续的地物分类、边缘检测和影像分割等处理工作。对于不同空间分辨率的影像数据,HPF算法中所采取的滤波器尺度应该有所不同,试验证明滤波器大小为影像高低分辨率之比的两倍时可以达到最佳的效果。

三、关键技术实现代码

//由于影像数据的全色锐化比为1/4,所以滤波器尺寸选择7×7
int FilterWidth = 7;
//读入全色影像
//	unsigned short *pHRImage = OpenTif(filepath2);
//	unsigned short *filterImg = new unsigned short[PanWidth*PanHeight];
//	memset(filterImg,0,sizeof(unsigned short)*PanWidth*PanHeight);
//	memcpy(filterImg,pHRImage,sizeof(unsigned short)*PanWidth*PanHeight);
    //这里拷贝全色影像,只是为了更好理解和保护原始影像,当然也可以直接在全色影像上滤波的
//	delete []pHRImage;pHRImage = NULL;
//创建滤波器
unsigned short *temp = new unsigned short[FilterWidth*FilterWidth];
memset(temp,0,sizeof(unsigned short)*FilterWidth*FilterWidth);


for (int i = FilterWidth/2;i < PanHeight - FilterWidth/2;++i)       
{
    for (int j = FilterWidth/2;j < PanWidth - FilterWidth/2;++j)
    {
	    int index=0;unsigned short sum = 0;
	    for (int k = -FilterWidth/2;k <= FilterWidth/2;++k)
	    {
		   for (int h = -FilterWidth/2;h <= FilterWidth/2;++h)
		   {
			   temp[index] = filterImg[(i + k) * PanWidth + (j + h)];//遍历滤波器中每个像元
			   index++;
			   sum += temp[index];
		   }
	    }
	    unsigned short t = sum - FilterWidth*FilterWidth*temp[FilterWidth*FilterWidth/2];
	    if (t > 65535)
	    {
		   t = 65535;
	    }
	    else if (t < 0)
	    {
		   t = 0;
	    }
	    filterImg[i * width + j] = t;//赋值
	}

}
delete []temp; temp = NULL;
//以上步骤就得到了全色影像的高频信息影像图了,下面直接将其叠加在多光谱影像上即可,记得释放内存。
int *tp = new int[nRastercount];
memset(tp,0,sizeof(int)*nRastercount);
//把高频成分加到多光谱图像上面
for(int i = 0;i < height;i++)
{
    for(int j = 0;j < width;j++)
	{	
		int t = filterImg[i*width+j];
		for (int n = 0;n < nRastercount;n++)
		{
			tp[n] = pMRImage[n][i*width+j];
			int tempbands = max(0,min(tp[n] + t,ColorLen-1));//这里需要注意,防止色彩溢出
			HPFresult[n][i*width+j] = tempbands;
		}
	}
}
delete []tp;tp = NULL;

代码中数据类型用的是unsigned short是由于影像为16bit,那么实际实现过程中应该根据源数据位深选择相应的数据类型。

四、结果展示

所用的航空影像像幅规模较大,这里仅仅展示局部图:

图像处理系列——图像融合之高通滤波(HPF)_第2张图片

图像处理系列——图像融合之高通滤波(HPF)_第3张图片

 

你可能感兴趣的:(图像处理)