matlab的gabor类解读

article/2025/9/16 14:18:20

为什么要进行解析,因为自带的gabor函数有个小坑, 转opencv的时候,因为没有完全理解自带的gabor源码被小小的坑了一下, 所以做一下记录, 以方便后人。‘

版本是2016B


文章目录

  • Matlab gabor函数解析
    • 1 gabor基本公式
    • 2 matlab的gabor类参数解析
    • 3 源码解读
      • 3.1 gabor源码
        • 3.1.1 空域gabor
        • 3.1.2 频域gabor
      • 3.2 imgaborfilt 源码
    • 总结

Matlab gabor函数解析

涉及函数:gaborimgaborfilt。 注意, 这两个函数是一套,相辅相成,其中gabor是一个类, 这加大了源码解读难度。这两个函数都是在matlab 2015b中引入的。

1 gabor基本公式

这里首先贴上gabor基本公式(wikipedia)。
值得注意的是

  1. matlab自带gabor函数利用的是公式1, 也就是含有实虚部的gabor公式
  2. opencv 3.1自带的gabor使用的是公式2, 仅使用了gabor滤波器的实部, 目的是减少计算量并带来相似的效果。
    gabor基本公式|center

2 matlab的gabor类参数解析

根据原始gabor公式, 拥有以下参数:

λ(lambda, 波长) θ(theta, 角度),σ(sigma), γ(gamma), φ(phi, 相移)。具体的每个参数的作用以及设置技巧, 网上太多资料,自己收集, 这里就不多做说明。

根据matlab gabor函数, 拥有以下输入参数:
wavelength , orientation, SpatialFrequencyBandwidth, SpatialAspectRation
其中,

  1. wavelength 就是原始公式中的λ(lambda),
  2. orientation就是原始公式中的θ(theta, 这里是角度制)
  3. SpatialAspectRatio 就是原始公式中的 , γ(gamma)
  4. SpatialFrequencyBandwidth(简称BW)则比较特殊,并不对应于其中的任何一个参数,但是它和σ(sigma)与λ(lambda)有以下关系。 也就是参数σ(sigma)可通过BW这个参数计算得到
    σ = λ π l n 2 2 2 B W + 1 2 B W − 1 \sigma = \frac{\lambda}{\pi} \sqrt{\frac{ln2}{2}} \frac{2^{BW}+1}{2^{BW}-1} σ=πλ2ln2 2BW12BW+1

另外: **参数 φ(phi)**在gabor函数中默认定义为0

总结

参数λ(lambda, 波长)θ(theta, 角度)γ(gamma)σ(sigma)φ(phi, 相移)
Matlab里的gabor参数wavelengthorientation(角度制)SpatialAspectRatio由参数SpatialFrequencyBandwidth和λ(lambda)转化得到默认为0

3 源码解读

详细完整的gaborimgaborfilt源码,自行在matlab中查看,这里只截取各自最为重要的部分;

3.1 gabor源码

3.1.1 空域gabor

\qquad 注意, 大坑!! \color{Red}{\text{注意, 大坑!!}} 注意, 大坑!!, get.SpatialKernel()返回的gabor核是你所能看到的gabor核,接下来imgaborfilt函数并不用此gabor核对你想要滤波的图进行卷积
\qquad 简单的说,更改此函数里面的内容,可视化gabor核会发现不同, 但是会发现imgaborfilt函数所输出的gabor响应图并没有什么不同。

function h = get.SpatialKernel(self)% Parameterization of spatial kernel frequency includes Phi as% an independent variable. We use a constant of 0.phi = 0 ;%φ默认为0% 这里把σ分为 σ_x, σ_y.与公式对应的关系是: %σ_x = σ;  σ_y = σ/γsigmax = self.SigmaX;sigmay = self.SigmaY;%获取gabor核的大小, 也就是gabor滤波器的大小(正方形)r = max(self.Rx, self.Ry);[X,Y] = meshgrid(-r:r,-r:r);%可以和公式对应上的Xprime = X .*cosd(self.Orientation) - Y .*sind(self.Orientation);Yprime = X .*sind(self.Orientation) + Y .*cosd(self.Orientation);%可以和公式对应上hGaussian = exp( -1/2*( Xprime.^2 ./ sigmax^2 + Yprime.^2 ./ sigmay^2));%gaussianhGaborEven = hGaussian.*cos(2*pi.*Xprime ./ self.Wavelength+phi);%实部hGaborOdd  = hGaussian.*sin(2*pi.*Xprime ./ self.Wavelength+phi);%虚部h = complex(hGaborEven, hGaborOdd);%复数形式end

3.1.2 频域gabor

注意: 这才是实际上用来和图像做卷积运算的gabor核。 \qquad \color{Red}{\text{注意: 这才是实际上用来和图像做卷积运算的gabor核。}} 注意: 这才是实际上用来和图像做卷积运算的gabor核。或许不该叫gabor核, 并不是我们所事先预料的那种生成gabor核然后和图像卷积的方式。而是直接依据gabor函数的输入参数在频域构建出与原图大小相同的gabor核的频率图!!!
\qquad 而且这个函数(或者按照c++叫法,类成员函数)是在imgaborfilt被调用的。这种方式会显著加快速度,算法依据是A,K,J的论文(大牛恐怖如斯啊~);

function H = makeFrequencyDomainTransferFunction(self, imageSize, classA)% Directly construct frequency domain transfer function of% Gabor filter. (Jain, Farrokhnia, "Unsupervised Texture% Segmentation Using Gabor Filters", 1999)% Directly construct frequency domain transfer function of% Gabor filter. (Jain, Farrokhnia, "Unsupervised Texture% Segmentation Using Gabor Filters", 1999)M = imageSize(1);N = imageSize(2);u = cast(images.internal.createNormalizedFrequencyVector(N),classA);v = cast(images.internal.createNormalizedFrequencyVector(M),classA);[U,V] = meshgrid(u,v);Uprime = U .*cosd(self.Orientation) - V .*sind(self.Orientation);Vprime = U .*sind(self.Orientation) + V .*cosd(self.Orientation);sigmau = 1/(2*pi*self.SigmaX);sigmav = 1/(2*pi*self.SigmaY);freq = 1/self.Wavelength;A = 2*pi*self.SigmaX*self.SigmaY;H = A.*exp(-0.5*( ((Uprime-freq).^2)./sigmau^2 + Vprime.^2 ./ sigmav^2) );end

3.2 imgaborfilt 源码

得到响应图的过程调用了gabor类的成员函数,以加快速度

%这段代码来源于matlab
for p = 1:length(GaborBank)%GaborBank是生成的gabor kernel的集合%sizeAPadded是对原始图像A(待卷积图)边界处理以后的尺寸;%class(A)是原始图像A的数据类型%函数makeFrequencyDomainTransferFunction是在类gabor的成员函数H = makeFrequencyDomainTransferFunction(GaborBank(p),sizeAPadded,class(A));outPadded = ifft2(A .* ifftshift(H));out(:,:,p) = unpadSlice(outPadded,padSize,outSize);
end

上述代码等价于下面代码现,下面的代码是我们通常所理解的方式

%这段代码与上面代码相同效果,使我们通常所理解的实现方式
for p = 1:length(GaborBank)outPadded = conv2(a, GaborBank(p).SpatialKernel, 'same');out(:,:,p) = unpadSlice(outPadded,padSize,outSize);end

总结

最后,如果要在opencv上取得相同的效果, 需要增加gabor的虚数部分, 如果要加快速度,需要采用A.K.J的实现方式~


http://chatgpt.dhexx.cn/article/yH2iWFQm.shtml

相关文章

Gabor滤波 + 多尺度问题

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

Gabor算法

在数字图像处理领域,Gabor滤波器是以Dennis Gabor命名的,Gabor滤波器是用作边缘检测的线性滤波器。Gabor滤波器的频率和方向的表达与人类的视觉系统很相似。研究发现,Gabor滤波器非常适合纹理表达和分离。在空间域中,一个二维Gabo…

Log-Gabor滤波器

Log-Gabor滤波器 G ( f ) e l n 2 ( ω / ω 0 ) 2 l n 2 ( k / ω 0 ) G(f)e^{\frac {ln^2({\omega /\omega_0})}{2{ln}^2(k/\omega_0)}} G(f)e2ln2(k/ω0​)ln2(ω/ω0​)​ 式中: ω 0 \omega_0 ω0​为滤波器中心频率,通常将 k / ω 0 k/\omega_0 k…

Gabor滤波器原理

一、什么是Gabor函数(以下内容含部分翻译自维基百科) 在图像处理中,Gabor函数是一个用于边缘提取的线性滤波器。Gabor滤波器的频率和方向表达同人类视觉系统类似。研究发现,Gabor滤波器十分适合纹理表达和分离。在空间域中&#x…

Gabor的OpenCV代码

唯一持续维护地址:http://52coding.com/opencv-gabor 最近弄人脸识别,用到Gabor卷积核,但网上的代码似乎没有和我心意的,于是参考了自己写了下!参考了Zhou Mian以及matlab的Gabor实现代码的代码。虽然OpenCV的imporc下…

2021-08-07 Gabor滤波器简介以及简单应用

Gabor滤波器(Gabor Filter) 文章目录 Gabor滤波器(Gabor Filter)简介Gabor滤波器的不同参数Gabor滤波器的简单应用(python) 简介 Gabor滤波器是一种线性滤波器,用于边缘检测、纹理分析、特征提…

Gabor Filters

Gabor Filters: Manjunath, B. S., & Ma, W. Y. (1996). Texture features for browsing and retrieval of image data. IEEE Transactions on Pattern Analysis and Machine Intelligence, 18(8), 837-842. Gabor滤波器是一种基于Gabor函数的特定频率和方向选择性滤波器。…

基于Gabor滤波器的人脸特征提取

Gabor小波变换的核函数,其最大的特点是其与人脑的皮层神经细胞的二维反射区具有相似的特征。基于Gabor小波变换的特征信息能够有效提取各种细节结构信息,因此Gabor小波变换在图像识别领域有着较为广泛的应用。根据Gabor小波变换的特点,基于Ga…

Gabor特征提取

Gabor小波与人类视觉系统中简单细胞的视觉刺激响应非常相似。它在提取目标的局部空间和频率域信息方面具有良好的特性。虽然Gabor小波本身并不能构成正交基,但在特定参数下可构成紧框架。Gabor小波对于图像的边缘敏感,能够提供良好的方向选择和尺度选择特…

Gabor 卷积神经网络

与不涉及学习过程的 hand-crafted 滤波器不同,DCNNs-based feature extraction 是一种 data-driven 技术,可以直接从数据中学习具有鲁棒性的特征表示。然而,它有非常大的训练成本和复杂的模型参数。 DCNNs 有限的几何变换建模能力主要来自于…

如何理解Gabor滤波器

转载自如何理解Gabor滤波器 介绍 我们已经知道,傅里叶变换是一种信号处理中的有力工具,可以帮助我们将图像从空域转换到频域,并提取到空域上不易提取的特征。但是经过傅里叶变换后,图像在不同位置的频度特征往往混合在一起&…

基于python的图像Gabor变换及特征提取

基于python的图像Gabor变换及特征提取 1.前言2. “Gabor帮主”简介3.“Gabor帮主”大招之图像变换3.“Gabor帮主”大招之图像特征提取 深圳中兴网信科技有限公司:廖海斌 1.前言 在深度学习出来之前,图像识别领域北有“Gabor帮主”,南有“SIF…

Gabor滤波器详解

转载自如何理解Gabor滤波器 介绍 我们已经知道,傅里叶变换是一种信号处理中的有力工具,可以帮助我们将图像从空域转换到频域,并提取到空域上不易提取的特征。但是经过傅里叶变换后,图像在不同位置的频度特征往往混合在一起&…

Gabor 变换

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

图像处理:Gabor滤波器简介以及python实现

在图像处理中,以Dennis Gabor命名的Gabor滤波器是一种用于纹理分析的线性滤波器,本质上是指在分析点或分析区域周围的局部区域内,分析图像中是否存在特定方向的特定频率内容。Gabor滤波器的频率和方向表示被许多当代视觉科学家认为与人类视觉…

Gabor滤波器学习

本文的目的是用C实现生成Gabor模版,并对图像卷积。并简单提一下,Gabor滤波器在纹理特征提取上的应用。 一、什么是Gabor函数(以下内容含部分翻译自维基百科) 在图像处理中,Gabor函数是一个用于边缘提取的线性滤波器。…

Gabor变换

2009-12-13 00:51:08| 分类: 图像处理|字号 订阅 转自 http://blog.sina.com.cn/s/blog_48a242d601000a3j.html~typev5_one&labelrela_prevarticle Gabor变换属于加窗傅立叶变换,Gabor函数可以在频域不同尺度、不同方向上提取相关的特征。另外Gabo…

Gabor滤波器

Gabor是一个用于边缘提取的线性滤波器,其频率和方向表达与人类视觉系统类似,能够提供良好的方向选择和尺度选择特性,而且对光照变换不敏感,因此十分适合纹理分析。 一、Gabor滤波器 在图像处理中,Gabor函数是一个用于…

Gabor 特征

一.Gabor 特征的简介 Gabor 特征是一种可以用来描述图像纹理信息的特征,Gabor 滤波器的频率和方向与人类的视觉系统类似,特别适合于纹理表示与判别。Gabor 特征主要依靠 Gabor 核在频率域上对信号进行加窗,从而能描述信号的局部频率信息。 …

Gabor滤波器特征提取原理讲解及c++实现

文章目录 Gabor滤波器复正弦载波高斯滤波 参数解释gabor滤波核实现效果: Gabor滤波器 1946年,Dennis Gabor于在“Theory of communication”一文中提出了著名的“窗口”傅里叶变换(也叫短时Fourier变换,STFT),即Gabor…