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

相关文章

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06