gabor函数学习

2023-10-21 20:48
文章标签 函数 学习 gabor

本文主要是介绍gabor函数学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Gabor变换属于加窗傅立叶变换,Gabor函数可以在频域不同尺度、不同方向上提取相关的特征。另外Gabor函数与人眼的生物作用相仿,所以经常用作纹理识别上,并取得了较好的效果。

 

Gabor变换是短时Fourier变换中当窗函数取为高斯函数时的一种特殊情况.

 

Gabor变换的本质实际上还是对二维图像求卷积。因此二维卷积运算的效率就直接决定了Gabor变换的效率。在这里我先说说二维卷积运算以及如何通过二维傅立叶变换提高卷积运算效率.关于离散二维叠加和卷积的运算介绍的书籍比较多,我这里推荐William K. Pratt著,邓鲁华 张延恒 等译的《数字图像处理(第3版)》,其中第7章介绍的就是这方面的运算.

[转载]Gabor <wbr><wbr>变换(1)

A可以理解成是待处理的笔迹纹理,B可以理解成Gabor变换的核函数,现在要求A与B的离散二维叠加卷积,我们首先对A的右边界和下边界填充0(zero padding),然后将B进行水平翻转和垂直翻转,如下图:

[转载]Gabor <wbr><wbr>变换(1)

然后用B中的每个值依次乘以A中相对位置处的值并进行累加,结果填入相应位置处(注意红圈位置)。通常二维卷积的结果比A、B的尺寸要大。如下图所示:

[转载]Gabor <wbr><wbr>变换(1)

2、快速傅立叶变换卷积

根据傅立叶变换理论,对图像进行二维卷积等价于对图像的二维傅立叶变换以及核函数的二维傅立叶变换在频域求乘法。通过二维傅立叶变换可以有效提高卷积的运算效率。但在进行傅立叶变换时一定要注意“卷绕误差效应”,只有正确对原有图像以及卷积核填补零后,才能得到正确的卷积结果。

 

二维Gabor函数可以表示为:


 

[转载]Gabor <wbr><wbr>变换(1)


其中:


 

[转载]Gabor <wbr><wbr>变换(1)


v的取值决定了Gabor滤波的波长,u的取值表示Gabor核函数的方向,K表示总的方向数。参数[转载]Gabor <wbr><wbr>变换(1)决定了高斯窗口的大小,这里取[转载]Gabor <wbr><wbr>变换(1). 程序中取4个频率(v=0, 1, ..., 3),8个方向(即K=8,u=0, 1, ... ,7),共32个Gabor核函数。不同频率不同方向的Gabor函数可通过下图表示:

[转载]Gabor <wbr><wbr>变换(1)


[转载]Gabor <wbr><wbr>变换(1)[转载]Gabor <wbr><wbr>变换(1)




对于Gabor基函数的描述各不相同。比如在我参考的文献中Gabor基函数的表述是:
                  

Gabor函数的再次理解 - 毽子 - 毽子不会落的博客

 而对于另一种表述,则是出现在我转载的上篇日志当中:gabor函数学习


  这两种表述不同,是因为这两种Gabor基函数都不是一般性的表述,都是经过了一些约束条件处理后的情况进行的表述,

像第二种表述是在其高斯包络为圆对称时的情况,由于圆对称,标准差 σ的值对于x,y来说是相等的;X包络和Y包络合并后,x,y的转向后的坐标x',y'的平方和也可以变成x,y的平方和(因为高斯包络的圆对称),于是便有了第二种表述形式。

而第一种表述形式的演化,大家有兴趣的可以参见文献《Uncertainty relation for resolution in space,spatialfrequency,and orientation optimized by two-dimensional visual cortical ?lters》,和《Biologically motivated computationally intensive approaches to image pattern recognition》。

网上大蛮多的代码是参照第二种表述来的,有需要的朋友,也可以找我要。

由于本人的个人需要,将对第一个Gabor函数作一些分析。。。。。。。

有人把Gabor函数看作加窗的傅立叶变换,有人把Gabor函数看作小波变换的变体,但无论如何,在一维情况中,Gabor变换代表着时频分析的最优方法,二维情况中则是空间频域分析的方法。Gabor变换在二维情况中可用于图像的纹理分析,纹理的特征参量有频率和方向,所以作为此用途的Gabor滤波也应有方向及中心频率的参量,以提取不同的纹理特性。


 


        gabor函数学习


 

   发现最后的平面波调制分量中的不同,第一个表述中是(x')的平方,而上述表述中是x',怀疑是作者的笔误。

下面就以上面这个Gabor函数为题进行其参数的讨论。

   不用多说:由于Gabor滤波器的方向性,x',y'是旋转之后的坐标,而 Θ 角便是Gabor滤波器的方向,
 ξ和η则是滤波器的中心位置,在求Gabor核的时候都会默认为原点位置,即(0,0);1/λ是Gabor的中心频率,
而φ是Gabor的相位,除了上面的之外,表达式中还有σ,γ,这些在后面会论及,下面我们一个一个对Gabor的参数进行解析。1

1)首先是γ,γ是空间方面比(spatial aspect ratio),是Gabor核高斯函数的纵横比,它的范围在0.23~0.92,在本案中取0.5,由第一个Gabor函数表达式对比可以知道,在γ取1/2的时候,σx = σy/2 = σ,这便是γ的意义,由于γ是预定义好的参数,所以,在Gabor函数中并不是变量参数,所以不决定Gabor函数的性质。

2)参数λ,参数λ是COS调制因子的波长,1/λ是Gabor 滤波器的中心频率,而σ/λ则决定了Gabor滤波器的带宽,一般带宽我们取1个倍频左右,索性取1.0,此时可求出σ/λ的值是0.56,(此值的得出可参阅参考文献);

3)参数Θ是“平行亮暗条纹”(指Gabor图像?)的垂直方向,即x'的坐标方向。

4)γ的值和空间频率带宽的值(即σ/λ的值)又决定了Gabor滤波器方向带宽的值;

5)最后,φ是cos调制因子的相位偏移值,φ决定了Gabor函数的对称性,比如在φ=0,π的时候,Gabor函数是中心(对于(ξ,η)来说)对称的,而当 φ=-π/2,π/2的时候,Gabor函数是中心反对称的,并且所有其他情况都是这两种情况的(线性?)组合。

 

如此以来,我们需要确定的参数便是:λ,Θ,另外在约束之下的参数是γ,σ,和Gabor核的大小size(x,y),求Gabor核的时候,我们将中心位置(ξ,η)默认放在原点。

这篇关于gabor函数学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/256871

相关文章

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、