Gabor滤波,可以实现上图类似的魔幻效果。本文只是预先给出原理部分和源代码实现,实际的应用于实践部分在后续文章。
本文首先看看Gabor到底为何物,它的各种参数都有什么含义,以及如何用C++和Python实现它。这是纯干货,虽然枯燥了点,但是后续的应用应该会更有意思。不着急,我们慢慢来。
以下定义翻译引用自维基百科:
在图像处理领域,以Dennis Gabor命名的Gabor滤波器,是一种用于纹理分析的线性滤波器,即它主要分析的是,图像在某一特定区域的特定方向上是否有特定的频率内容。当代许多视觉科学家认为,Gabor滤波器的频率和方向的表达与人类的视觉系统很相似,尽管并没有实验性证据和函数原理能证明这一观点。研究发现,Gabor滤波器特别适合于纹理表示和辨别。在空间域中,2D Gabor滤波器是由正弦平面波调制的高斯核函数。
其脉冲响应定义为定义为一个正弦波(对于二维Gabor滤波器是平面波)乘以高斯函数。因为乘法卷积性质(卷积定理),由于乘法卷积性质,Gabor滤波器的脉冲响应的傅立叶变换是调和函数的傅立叶变换和高斯函数傅立叶变换的卷积。该滤波器具有表示正交方向的实部和虚部。两个分量可以构成复数或单独使用。
复数形式
实部
虚部
其中
如果你了解傅立叶变换的基础,那么你应该知道,图像可以视为各个方向的一系列不同频率的正弦波叠加而成。变换中的“像素”表示波的强度,“像素”的位置表示波的频率和方向。在实践中,人们只想选择特定频率和特定方向的特定波。Gabor变换是许多所谓的带通滤波器之一,它允许你“切割”傅立叶变换,只隔离特定的信息。另一个重要信息是,每个傅立叶“像素”是一个复数值(包含实部和虚部)。
二维Gabor核函数由一个高斯包络函数和一个余弦函数相乘得出,其中θ,ϕ,γ,λ,σ为参数。
A complex Gabor filter is defined as the product of a Gaussian kernel times a complex sinusoid.
Gaussian envelope mentiond in this method determines the width of the Gaussian kernel.
Paper--- Fingerprint Image Enhancement: Algorithm and Performance Evaluation
需要注意的是,(x,y)是原始坐标,(x',y')是旋转后的坐标。在(x,y)坐标系中,Gabor只能沿x轴或y轴拉伸,但不能对角拉伸。但是上述最后两个公式允许Gabor能够在(x',y')坐标系中沿任何方向被拉伸(由θ定义)。
Python实现
维基百科给出了Gabor函数的Python实现。放在下面供参考。
Gabor函数的OpenCV实现
跟其他滤波器(高斯,Sobel)等一样,需要先确定一个卷积核,然后用次卷积核通过滑窗法对输入图像进行卷积运算,得到输出图像。Gabor函数的OpenCV实现getGaborKernel函数,正是为了得到这个卷积核的。为在OpenCV中的函数里需要传入的参数除了上述5个外,还需要传入卷积核的大小。
各参数含义
:返回的滤波器的大小,即Gabor核的大小。如果,那么Gabor核的大小即为像素。与许多其他的卷积核一样,这个尺寸一般取奇数而且为正方形。
:是Gabor过滤器中实用的高斯函数的标准差。
:是Gabor函数的平行条纹的法线方向。有效值为从0~360度的实数。
:是上述方程中正弦因子的波长。有效值应大于2,以像素为单位。
:是空间宽高比,表示Gabor滤波器的椭圆度
:是相位偏移。有效值为-180度~180度,0度和180度对应的方程与原点对称,-90度和90度的方程分别于原点成中心对称,可两项直角坐标系中的余弦函数。
:像素类型。
OpenCV的Gabor源码
源码在。仔细看上下两种实现的话,可以明显看出OpenCV的实现参考了维基百科的Python实现。只不过在加了一个确定卷积和大小的参数而已。而且在这个参数为(0,0)的时候,采用的正是维基百科中的方法。
参考
欢迎加入微信交流群
领取专属 10元无门槛券
私享最新 技术干货