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实现服务器中只重载被修改的进程的方法
Apr 30 Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 Python
Python中str.join()简单用法示例
Mar 20 Python
解决Python requests库编码 socks5代理的问题
May 07 Python
python实现爬山算法的思路详解
Apr 09 Python
Python实现京东秒杀功能代码
May 16 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
Jun 04 Python
python中bs4.BeautifulSoup的基本用法
Jul 27 Python
Python中生成一个指定长度的随机字符串实现示例
Nov 06 Python
调整Jupyter notebook的启动目录操作
Apr 10 Python
matplotlib 对坐标的控制,加图例注释的操作
Apr 17 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
Jun 11 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为php增加openssl模块的方法
2011/06/14 PHP
php unset全局变量运用问题的深入解析
2013/06/17 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
ThinkPHP中create()方法自动验证实例
2017/04/26 PHP
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
『jQuery』取指定url格式及分割函数应用
2013/04/22 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
Javascript前端经典的面试题及答案
2017/03/14 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
js实现ajax的用户简单登入功能
2020/06/18 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
PHP webshell检查工具 python实现代码
2009/09/15 Python
Python基于回溯法子集树模板解决数字组合问题实例
2017/09/02 Python
pandas.DataFrame.to_json按行转json的方法
2018/06/05 Python
浅析python继承与多重继承
2018/09/13 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
Django实现跨域请求过程详解
2019/07/25 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
Python使用字典实现的简单记事本功能示例
2019/08/15 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
PyQT5 实现快捷键复制表格数据的方法示例
2020/06/19 Python
One.com挪威:北欧成长最快的网络托管公司
2016/11/19 全球购物
公司部门司机岗位职责
2014/01/03 职场文书
电子商务实训报告总结
2014/11/05 职场文书
2014年残联工作总结
2014/11/21 职场文书
服务承诺书
2015/01/19 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang
python在package下继续嵌套一个package
2022/04/14 Python
Python 统计序列中元素的出现频度
2022/04/26 Python