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中的装饰器、闭包和functools的教程
Apr 02 Python
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
Python简单实现两个任意字符串乘积的方法示例
Apr 12 Python
python3获取当前文件的上一级目录实例
Apr 26 Python
Python实现登陆文件验证方法
Oct 06 Python
python pandas 时间日期的处理实现
Jul 30 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
Python监听剪切板实现方法代码实例
Nov 11 Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 04 Python
一文搞懂Python Sklearn库使用
Aug 23 Python
Python学习之时间包使用教程详解
Mar 21 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 date与gmdate的获取日期的区别
2010/02/08 PHP
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
Js中sort()方法的用法
2006/11/04 Javascript
基于jQuery的表格操作插件
2010/04/22 Javascript
JavaScript 盒模型 尺寸深入理解
2012/12/31 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
jQuery 无刷新分页实例代码
2013/11/12 Javascript
jQuery获取Radio,CheckBox选择的Value值(示例代码)
2013/12/12 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
IE下JS保存图片的简单实例
2016/07/15 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
Jquery调用iframe父页面中的元素及方法
2016/08/23 Javascript
JS之获取样式的简单实现方法(推荐)
2016/09/13 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
2017/02/10 Javascript
微信小程序动态添加view组件的实例代码
2019/05/23 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
python 截取 取出一部分的字符串方法
2017/03/01 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
一文秒懂python读写csv xml json文件各种骚操作
2019/07/04 Python
对Python中画图时候的线类型详解
2019/07/07 Python
python实现学生信息管理系统(精简版)
2020/11/27 Python
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
九年级政治教学反思
2014/02/06 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
学习十八大的心得体会
2014/09/12 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
情况说明书怎么写
2015/10/08 职场文书