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 18 Python
Python匹配中文的正则表达式
May 11 Python
python下如何查询CS反恐精英的服务器信息
Jan 17 Python
快速实现基于Python的微信聊天机器人示例代码
Mar 03 Python
Python单体模式的几种常见实现方法详解
Jul 28 Python
python让列表倒序输出的实例
Jun 25 Python
Python进阶之全面解读高级特性之切片
Feb 19 Python
python redis连接 有序集合去重的代码
Aug 04 Python
python 实现将Numpy数组保存为图像
Jan 09 Python
python爬虫开发之PyQuery模块详细使用方法与实例全解
Mar 09 Python
python topk()函数求最大和最小值实例
Apr 02 Python
python下载的库包存放路径
Jul 27 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
PHP二维数组的去重问题解析
2011/07/17 PHP
PHP关联链接常用代码
2012/11/05 PHP
php实现mysql事务处理的方法
2014/12/25 PHP
php单例模式示例分享
2015/02/12 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
Jquery选择器中使用变量实现动态选择例子
2014/07/25 Javascript
javascript中Date对象的getDay方法使用指南
2014/12/22 Javascript
JS动态加载当前时间的方法
2015/02/09 Javascript
JS简单模拟触发按钮点击功能的方法
2015/11/30 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
Bootstrap响应式侧边栏改进版
2016/09/17 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
在Django框架中伪造捕捉到的URLconf值的方法
2015/07/18 Python
Python 学习教程之networkx
2019/04/15 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
python设置表格边框的具体方法
2020/07/17 Python
Python 读取位于包中的数据文件
2020/08/07 Python
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
村党支部群众路线教育实践活动对照检查材料
2014/09/26 职场文书
大学生自我推荐信范文
2015/03/24 职场文书
运动会通讯稿100字
2015/07/20 职场文书
运动会3000米加油稿
2015/07/21 职场文书
go xorm框架的使用
2021/05/22 Golang
keepalived + nginx 实现高可用方案
2022/12/24 Servers