Gabor Filter

以下定义翻译引用自维基百科:

在图像处理领域,以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实现。放在下面供参考。

import numpy as npdef gabor_fn(sigma, theta, Lambda, psi, gamma):sigma_x = sigmasigma_y = float(sigma) / gamma# ------这部分内容是为了确定卷积核的大小------# Bounding boxnstds = 3 # Number of standard deviation sigmaxmax = max(abs(nstds * sigma_x * np.cos(theta)), abs(nstds * sigma_y * np.sin(theta)))xmax = np.ceil(max(1, xmax))ymax = max(abs(nstds * sigma_x * np.sin(theta)), abs(nstds * sigma_y * np.cos(theta)))ymax = np.ceil(max(1, ymax))xmin = -xmaxymin = -ymax(y, x) = np.meshgrid(np.arange(ymin, ymax + 1), np.arange(xmin, xmax + 1))# ------这部分内容是为了确定卷积核的大小------# Rotation x_theta = x * np.cos(theta) + y * np.sin(theta)y_theta = -x * np.sin(theta) + y * np.cos(theta)# ------这部分正是上面的公式(1)------gb = np.exp(-.5 * (x_theta ** 2 / sigma_x ** 2 + y_theta ** 2 / sigma_y ** 2)) * np.cos(2 * np.pi / Lambda * x_theta + psi)return gb

Gabor函数的OpenCV实现

跟其他滤波器(高斯,Sobel)等一样,需要先确定一个卷积核,然后用次卷积核通过滑窗法对输入图像进行卷积运算,得到输出图像。Gabor函数的OpenCV实现getGaborKernel函数,正是为了得到这个卷积核的。为在OpenCV中的getGaborKernel函数里需要传入的参数除了上述5个外,还需要传入卷积核的大小。

cv::Mat getGaborKernel(Size ksize, double sigma, double theta, double lambd, double gamma, double psi=CV_PI*0.5, int ktype=CV_64F );
cv2.getGaborKernel(ksize, sigma, theta, lambda, gamma, psi, ktype)

各参数含义

ksize:返回的滤波器的大小,即Gabor核的大小。如果ksize=(a,b),那么Gabor核的大小即为axb像素。与许多其他的卷积核一样,这个尺寸一般取奇数而且为正方形。

sigmaσ是Gabor过滤器中实用的高斯函数的标准差。

thetaθ是Gabor函数的平行条纹的法线方向。有效值为从0~360度的实数。

lambdaλ是上述方程中正弦因子的波长。有效值应大于2,以像素为单位。

gammaγ是空间宽高比,表示Gabor滤波器的椭圆度

psiψ是相位偏移。有效值为-180度~180度,0度和180度对应的方程与原点对称,-90度和90度的方程分别于原点成中心对称,可两项直角坐标系中的余弦函数。

ktype:像素类型。

OpenCV的Gabor源码

源码在opencv\sources\modules\imgproc\src\gabor.cpp。仔细看上下两种实现的话,可以明显看出OpenCV的实现参考了维基百科的Python实现。只不过在加了一个确定卷积和大小的参数而已。而且在这个参数为(0,0)的时候,采用的正是维基百科中的方法。

cv::Mat cv::getGaborKernel( Size ksize, double sigma, double theta,double lambd, double gamma, double psi, int ktype )
{double sigma_x = sigma;double sigma_y = sigma/gamma;int nstds = 3;int xmin, xmax, ymin, ymax;double c = cos(theta), s = sin(theta);// ------这部分内容是为了确定卷积核的大小------// ------可以看到,如果ksize不为0,则取ksize的一半------if( ksize.width > 0 )xmax = ksize.width/2;// ------如果ksize为0,则按照维基百科的方式来取值------elsexmax = cvRound(std::max(fabs(nstds*sigma_x*c), fabs(nstds*sigma_y*s)));if( ksize.height > 0 )ymax = ksize.height/2;elseymax = cvRound(std::max(fabs(nstds*sigma_x*s), fabs(nstds*sigma_y*c)));xmin = -xmax;ymin = -ymax;//------这部分内容是为了确定卷积核的大小------CV_Assert( ktype == CV_32F || ktype == CV_64F );Mat kernel(ymax - ymin + 1, xmax - xmin + 1, ktype);double scale = 1;double ex = -0.5/(sigma_x*sigma_x);double ey = -0.5/(sigma_y*sigma_y);double cscale = CV_PI*2/lambd;for( int y = ymin; y <= ymax; y++ )for( int x = xmin; x <= xmax; x++ ){double xr = x*c + y*s;double yr = -x*s + y*c;// ------此处正是上面的公式(1)------double v = scale*std::exp(ex*xr*xr + ey*yr*yr)*cos(cscale*xr + psi);if( ktype == CV_32F )kernel.at<float>(ymax - y, xmax - x) = (float)v;elsekernel.at<double>(ymax - y, xmax - x) = v;}return kernel;
}

参考

  1. https://en.wikipedia.org/wiki/Gabor_filter
  2. https://dsp.stackexchange.com/questions/14714/understanding-the-gabor-filter-function
  3. https://math.stackexchange.com/questions/259877/value-of-x-y-in-computing-gabor-filter-function
  4. https://cvtuts.wordpress.com/2014/04/27/gabor-filters-a-practical-overview/
  5. http://blog.csdn.net/xufangpang/article/details/6426244
  6. https://math.stackexchange.com/questions/177977/how-to-intuitively-interpret-gabor-lambda-param

公众号CVPy,分享不仅限于OpenCV和Python的有意思的内容。

魔幻滤镜Gabor Filter 原理与实现(python C++)相关推荐

  1. FFmpeg从入门到入魔(5):浅析滤镜(filter)原理

    1. 什么是滤镜  滤镜(filter)是指将未经过处理的原始音频帧(如PCM)或视频帧(如YUV.RGB)经过滤镜器处理后,得到具体"特殊效果"的音频帧或视频帧,比如音频帧被添加 ...

  2. Photoshop CS 中的“照片滤镜/Photo Filter”命令详解(转)

    Photoshop CS 中的"照片滤镜/Photo Filter"命令详解(转)[@more@] 这是一个跟摄影有关的重要图像调整命令. 有关这一命令的教程,现在网上没一个能说得 ...

  3. 数据分享 | LSTM神经网络架构和原理及其在Python中的预测应用(附视频)

    本文约2800字,建议阅读10+分钟 本文与你分享如何使用长短期记忆网络(LSTM)来拟合一个不稳定的时间序列. 长短期记忆网络--通常称为"LSTM"--是一种特殊的RNN递归神 ...

  4. 深度学习(神经网络) —— BP神经网络原理推导及python实现

    深度学习(神经网络) -- BP神经网络原理推导及python实现 摘要 (一)BP神经网络简介 1.神经网络权值调整的一般形式为: 2.BP神经网络中关于学习信号的求取方法: (二)BP神经网络原理 ...

  5. python原理书籍_python书籍推荐:《深入浅出深度学习:原理剖析与Python实践》

    在过去的这十年,深度学习已经席卷了整个科技界和工业界,2016年谷歌阿尔法狗打败围棋世界冠军李世石,更是使其成为备受瞩目的技术焦点. 今日,小编就为大家推荐一本能让初学者和"老司机" ...

  6. ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter)

    ===================================================== ffdshow源代码分析系列文章列表: ffdshow 源代码分析 1: 整体结构 ffds ...

  7. LDA主题模型原理解析与python实现

    本文转自:LDA主题模型原理解析与python实现_wind_blast的博客-CSDN博客   python实现: #-*- coding:utf-8 -*- import logging impo ...

  8. gabor filters matlab,gabor filter matlab

    场景:matlab兑现gabor filter (1) matlab实现gabor filter (1) 在 matlab中进行计算gabor filter,自己一步步的构建滤波器矩阵: 先构建gab ...

  9. gabor filters matlab,matlab实现gabor filter (1)

    在 matlab中进行计算gabor filter,自己一步步的构建滤波器矩阵: 先构建gabor滤波器,然后和需要进行滤波的图像进行卷积 代码中的size用来确定gabor filter卷积模板窗口 ...

最新文章

  1. 如何看待亚马逊 AI 李沐团队大批人员离职?
  2. 【python自动化第八篇:网络编程】
  3. oracle11g dataguard完全手册3-failover active dataguard(完)
  4. 使用curl下载上传ftp
  5. SpringBoot配置Druid
  6. Homepage Machine Learning Algorithm 浅谈深度学习中的激活函数 - The Activation Function in Deep Learning
  7. 如何模拟Spring bean(版本2)
  8. 删除单元格_VBA(实验1)用VBA 删除某列空单元格的3种方法:删除法,转移到其他列方法,数组方法...
  9. 手机MODEM 开发(23)---Modem1 NVRAM基础知识总结
  10. Ext 2.0布局实例
  11. 如何编写自己的python包,并进行安装和发布
  12. 老旧计算机桌面,四种旧电脑改造桌面虚拟化的方案
  13. 关于音频情感分类的随笔(3)
  14. C# graphics方法
  15. 顺序主子式的英文翻译(定义)
  16. 大家注意了,猪八戒网上有个骗子
  17. Latex---局部调大字体--下划线--首行缩进--悬挂缩进
  18. 用Python实现连续图文识别
  19. 为什么“总结经验”反而把你带进沟里?
  20. F. chino with ball

热门文章

  1. 微信内置浏览器 缓存清理
  2. python预测股票 keras_keras实现股票预测
  3. 分步傅里叶算法_快速分步傅里叶算法,split-step fast Fourier transform,音标,读音,翻译,英文例句,英语词典...
  4. linux内核启动过程3:内核初始化阶段
  5. 字节跳动Java研发面试总结:2个星期,4轮面试,我终于拿到offer
  6. Android Q适配攻略(四)(后台Activity启动限制)
  7. mysql 字段 大于0_mysql 字段类型
  8. 永磁同步电机(PMSM)参数辨识(一)
  9. FRED应用:激光空间滤波器的模拟
  10. 机器学习——强化学习概述