同态滤波

Posted HUSTLX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同态滤波相关的知识,希望对你有一定的参考价值。

在生活中会得到这样的图像,它的动态范围很大,而我们感兴趣的部分的灰度又很暗,图像细节没有办法辨认,采用一般的灰度级线性变换法是不行的。图像的同态滤波属于图像频率域处理范畴,其作用是对图像灰度范围进行调整,通过消除图像上照明不均的问题,增强暗区的图像细节,同时又不损失亮区的图像细节. 我们人眼能分别得出图像的灰度不仅仅是由于光照函数(照射分量)决定,而且还与反射函数(反射分量)有关,反射函数反映出图像的具体内容。光照强度一般具有一致性,在空间上通常会有缓慢变化的性质,在傅立叶变换下变现为低频分量,然而不一样的材料的反射率差异较大,经常会引起反射光的急剧变化,从而使图像的灰度值发生变化,这种变化与高低频分量有关。为了消除不均匀照度的影响,增强图像的高频部分的细节,可以采用建立在频域的同态滤波器对光照不足或者有光照变化的图像进行处理,可以尽量减少因光照不足引起的图像质量下降,并对感兴趣的景物进行有效增强,这样就在很大程度上做到了原图像的图像增强。

同态滤波是一种在频域中进行的图像对比度增强和压缩图像亮度范围的特殊方法。同态滤波器能够减少低频并且增加高频,从而能减少光照变化并锐化边缘细节。图像的同态滤波技术的依据是图像获取过程中的照明反射成像原理。它属于频域处理,作用是对图像灰度范围进行调整,通过消除图像上照明不均的问题。非线性滤波器能够在很好地保护细节的同时, 去除信号中的噪声,同态滤波器就是一种非线性滤波器,其处理是一种基于特征的对比度增强方法,主要用于减少由于光照不均匀引起的图像降质,并对感兴趣的景物进行有效地增强。

同台系统适用于服从广义叠加原理,输入和输出之间可以用线性变化表示的系统。图像的同态滤波是基于以入射光和反射光为基础的图像模型上的,如果把图像函数clip_image002[14]表示为光照函数,即照射分量clip_image004[10]与反射分量clip_image006[14]两个分量的乘积,那么图像的模型可以表示为clip_image008[6],其中clip_image010[6]clip_image012[6]clip_image006[15]的性质取决于成像物体的表面特性。通过对光照分量和反射分量的研究可知,光照分量一般反映灰度的恒定分量,相当于频域中的低频信息,减弱入射光就可以起到缩小图像灰度范围的作用;而反射光与物体的边界特性是密切相关的,相当于频域中的高频信息,增强反射光就可以起到提高图像对比度的作用。因此,同态滤波器的传递函数一般在低频部分小于1,高频部分大于1

进行同态滤波,首先要对原图像clip_image002[15]取对数,目的是使得图像模型中的乘法运算转化为简单的加法运算:

clip_image014[6]

再对对数函数做傅立叶变换,目的是将图像转换到频域:

clip_image016[6]clip_image018[6]

clip_image019[6]

同态滤波器的传递函数H(U,V)

选择适当的传递函数,压缩照射分量clip_image004[11]的变化范围,削弱clip_image020[6],增强反射分量clip_image006[16]的对比度,提升clip_image021[6],增强高频分量,即确定一个合适的clip_image023[14]。由上分析可知clip_image023[15]的大致形状如上图所示。

     假设用一个同态滤波器函数clip_image023[16]来处理原图像clip_image002[16]的对数的傅立叶变换clip_image028[6],得

clip_image030[6]

逆变换到空域得clip_image032[6]

再对取指数即得到最终处理结果clip_image034[6]:,相当于高通滤波。clip_image036[6]

 

                    同态滤波的原理框图

算法实现及结果分析

核心算法

void homomorphicFiltering(unsigned char* des, const unsigned char* src, int height, int width, double cutoff, int n, double cvar)
{
    int x,y;
 
    int ewidth,eheight;
    Complex* temp = new Complex[width * height];    //图像的复数形式
    Complex* eimg1;     //扩展后图像(适应FFT的大小要求)
    Complex* eimg2;     //扩展后图像
    Complex* filter;    //滤波器
 
    //1.转换图像形式,并取log
    for(y = 0; y < height; y++)
    {
        for(x = 0; x < width; x++)
        {
            temp[y * width + x].real = log((double)src[y * width + x] + 1);
            temp[y * width + x].imag = 0;
        }
    }
 
    //2.扩展源图像
    expand(&eimg1, &ewidth, &eheight, temp, width, height);
    eimg2 = new Complex[ewidth * eheight];
    filter = new Complex[ewidth * eheight];
 
 
    //3.获得滤波器
    getButterworthFilter(filter, ewidth, eheight, cutoff, n);
 
    //4.FFT
    FFT2D(eimg2, eimg1, ewidth, eheight);
 
    //5.滤波
    filtering(eimg2, ewidth, eheight, filter);
 
    //6.IFFT
    IFFT2D(eimg1, eimg2, ewidth, eheight);
 
    //7.还原并取exp
    for(y = 0; y < height; y++)
    {
        for(x = 0; x < width; x++)
        {
            temp[y * width + x].real = exp(eimg1[y * ewidth + x].real);
        }
    }
 
    //8.归一化
    clipNormalization(temp, width, height, cvar);
 
 
    //9.转换为图像形式
    for(y = 0; y < height; y++)
    {
        for(x = 0; x < width; x++)
        {
            des[y * width + x] = (unsigned char)temp[y * width + x].real;
        }
    }
}

  

 

 

clip_image038[6]clip_image040[6]

 

clip_image042[6]clip_image044[6]

 

从实验结果可知:在频域内的同态滤波方法只要选取适当的滤波器参数,就可以在增强图像高频信息的同时保留部分低频信息,达到压缩图像灰度的动态范围,增强图像的对比度的效果。本文通过光照场的频谱分析,能快速准确地选取滤波器参数。改进的同同态滤波器的参数获取办法,有利于快速获得增强效果好的参数,对光照不均匀的图像的补偿效果更明显。

 

以上是关于同态滤波的主要内容,如果未能解决你的问题,请参考以下文章

同态滤波

基于Matlab医学图像增强(使用同态滤波的方法)

基于OpenCV的同态滤波

图像增强基于matlab HSI+同态滤波彩色图像增强含Matlab源码 1515期

线性滤波器与非线性滤波器有啥区别?

图像增强基于matlab同态增晰图像增强含Matlab源码 962期