python Gabor滤波器讲解


Posted in Python onOctober 26, 2020

解读Gabor滤波器

Fourier 变换是一种信号处理的有力工具,可以将图像从空域转换到频域,并提取到空域上不易提取到的特征。但是Fourier变换缺乏时间和位置的局部信息。
Gabor 变换是一种短时加窗Fourier变换(简单理解起来就是在特定时间窗内做Fourier变换),是短时傅里叶变换中窗函数取为高斯函数时的一种特殊情况。因此,Gabor滤波器可以在频域上不同尺度、不同方向上提取相关的特征。另外,Gabor函数与人眼的作用相仿,所以经常用作纹理识别上,并取得了较好的效果。
在二维空间中,使用一个三角函数(a)(如正弦函数)与一个高斯函数(b)叠加,我们得到了一个Gabor滤波器(c)。如下图所示:

python Gabor滤波器讲解

Gabor函数解读

二维Gabor函数的数学表达式如下:

复数表示:

python Gabor滤波器讲解

实数部分:

python Gabor滤波器讲解

虚数部分:

python Gabor滤波器讲解

x'、y' 计算公式:

python Gabor滤波器讲解

介绍公式中各个参数的含义:

波长(λ):表示Gabor核函数中余弦函数的波长参数。它的值以像素为单位制定,通常大于等于2,但不能大于输入图像尺寸的1/5.
方向(θ):表示Gabor滤波核中平行条带的方向。有效值为从0°到360°的实数。
相位偏移(ψ):表示Gabor核函数中余弦函数的相位参数。它的取值范围为-180°到180°。其中,0°与180°对应的方程与原点对称,-90°和90°的方程关于原点成中心对称。
长宽比(γ):空间纵横比,决定了Gabor函数形状的椭圆率。当γ=1时,形状是圆形;当γ<1时,形状随着平行条纹方向而拉长。通常该值为0.5.
带宽(b):Gabor滤波器的半响应空间频率带宽b和σ/λ的比率有关,其中σ表示Gabor函数的高斯因子的标准差。三者有如下关系:

python Gabor滤波器讲解

σ的值不能直接设置,它仅随带宽b变换。带宽的值必须是正实数,通常为1,此时,标准差和波长的关系为 σ=0.56λ。带宽越小,标准差越大,Gabor形状越大,可见平行条纹数量越多。

python实现Gabor滤波器

# Gabor 滤波器实现
# K_size:Gabor核大小 K_size x K_size
# Sigma : σ
# Gamma: γ
# Lambda:λ
# Psi : ψ
# angle: θ
def Gabor_filter(K_size=111, Sigma=10, Gamma=1.2, Lambda=10, Psi=0, angle=0):
	# get half size
	d = K_size // 2

	# prepare kernel
	gabor = np.zeros((K_size, K_size), dtype=np.float32)

	# each value
	for y in range(K_size):
		for x in range(K_size):
			# distance from center
			px = x - d
			py = y - d

			# degree -> radian
			theta = angle / 180. * np.pi

			# get kernel x
			_x = np.cos(theta) * px + np.sin(theta) * py

			# get kernel y
			_y = -np.sin(theta) * px + np.cos(theta) * py

			# fill kernel
			gabor[y, x] = np.exp(-(_x**2 + Gamma**2 * _y**2) / (2 * Sigma**2)) * np.cos(2*np.pi*_x/Lambda + Psi)

	# kernel normalization
	gabor /= np.sum(np.abs(gabor))

	return gabor

python做出不同角度Gabor滤波器的图像

import cv2
import numpy as np
import matplotlib.pyplot as plt


# Gabor 滤波器实现
# K_size:Gabor核大小 K_size x K_size
# Sigma : σ
# Gamma: γ
# Lambda:λ
# Psi : ψ
# angle: θ
def Gabor_filter(K_size=111, Sigma=10, Gamma=1.2, Lambda=10, Psi=0, angle=0):
	# get half size
	d = K_size // 2

	# prepare kernel
	gabor = np.zeros((K_size, K_size), dtype=np.float32)

	# each value
	for y in range(K_size):
		for x in range(K_size):
			# distance from center
			px = x - d
			py = y - d

			# degree -> radian
			theta = angle / 180. * np.pi

			# get kernel x
			_x = np.cos(theta) * px + np.sin(theta) * py

			# get kernel y
			_y = -np.sin(theta) * px + np.cos(theta) * py

			# fill kernel
			gabor[y, x] = np.exp(-(_x**2 + Gamma**2 * _y**2) / (2 * Sigma**2)) * np.cos(2*np.pi*_x/Lambda + Psi)

	# kernel normalization
	gabor /= np.sum(np.abs(gabor))

	return gabor


# define each angle
As = [0, 45, 90, 135]

# prepare pyplot
plt.subplots_adjust(left=0, right=1, top=1, bottom=0, hspace=0, wspace=0.2)

# each angle
for i, A in enumerate(As):
 # get gabor kernel
 gabor = Gabor_filter(K_size=111, Sigma=10, Gamma=1.2, Lambda=10, Psi=0, angle=A)

 # normalize to [0, 255]
 out = gabor - np.min(gabor)
 out /= np.max(out)
 out *= 255
 
 out = out.astype(np.uint8)
 plt.subplot(1, 4, i+1)
 plt.imshow(out, cmap='gray')
 plt.axis('off')
 plt.title("Angle "+str(A))

plt.savefig("out.png")
plt.show()

实验输出Gabor滤波器图像

python Gabor滤波器讲解

opencv(python)中使用Gabor滤波器

函数原型:

retval=cv.getGaborKernel(ksize, sigma, theta, lambd, gamma[, psi[, ktype]])

函数使用举例

import numpy as np 
import cv2 as cv 

# retval = cv.getGaborKernel(ksize, sigma, theta, lambd, gamma[, psi[, ktype]])
# Ksize 是一个元组
retval = cv.getGaborKernel(ksize=(111,111), sigma=10, theta=60, lambd=10, gamma=1.2)
image1 = cv.imread('../paojie.jpg')
# dst	=	cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
result = cv.filter2D(image1,-1,retval)

cv.imshow('result',result)
cv.waitKey(0)
cv.destroyAllWindows()

实验结果:

python Gabor滤波器讲解
python Gabor滤波器讲解

参考:
python实现Gabor滤波器
Gabor滤波器参数详解
Gabor滤波器原理及opencv中的实现

到此这篇关于python Gabor滤波器讲解的文章就介绍到这了,更多相关Gabor滤波器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 简易计算器程序,代码就几行
Aug 29 Python
从零开始学Python第八周:详解网络编程基础(socket)
Dec 14 Python
Python原始字符串与Unicode字符串操作符用法实例分析
Jul 22 Python
手把手教你python实现SVM算法
Dec 27 Python
Python爬虫天气预报实例详解(小白入门)
Jan 24 Python
创建pycharm的自定义python模板方法
May 23 Python
python3学生名片管理v2.0版
Nov 29 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
python打造爬虫代理池过程解析
Aug 15 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
Sep 29 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
python中if和elif的区别介绍
Nov 07 Python
详解基于python的图像Gabor变换及特征提取
Oct 26 #Python
多个版本的python共存时使用pip的正确做法
Oct 26 #Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
Oct 26 #Python
如何使用Pytorch搭建模型
Oct 26 #Python
使用python-cv2实现视频的分解与合成的示例代码
Oct 26 #Python
python递归函数用法详解
Oct 26 #Python
Python实现LR1文法的完整实例代码
Oct 25 #Python
You might like
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
2017/08/17 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
鼠标焦点离开文本框时验证的js代码
2013/07/19 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
python 读入多行数据的实例
2018/04/19 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
Python定时任务框架APScheduler原理及常用代码
2020/10/05 Python
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
一道Delphi面试题
2016/10/28 面试题
会计电算化个人自我评价
2013/11/17 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
团队会宣传标语
2014/10/09 职场文书
2015毕业生实习工作总结
2014/12/12 职场文书
企业介绍信范文
2015/01/30 职场文书
刘公岛导游词
2015/02/05 职场文书
新手开公司创业注意事项有哪些?
2019/07/29 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python
jquery插件实现悬浮的菜单
2021/04/24 jQuery
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang