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进行二进制文件读写的简单方法(推荐)
Sep 12 Python
Python搭建HTTP服务器和FTP服务器
Mar 09 Python
python3 遍历删除特定后缀名文件的方法
Apr 23 Python
好的Python培训机构应该具备哪些条件
May 23 Python
Python import与from import使用及区别介绍
Sep 06 Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 Python
pandas的排序和排名的具体使用
Jul 31 Python
原来我一直安装 Python 库的姿势都不对呀
Nov 11 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
python二维图制作的实例代码
Dec 03 Python
Selenium环境变量配置(火狐浏览器)及验证实现
Dec 07 Python
selenium学习教程之定位以及切换frame(iframe)
Jan 04 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
如何在HTML 中嵌入 PHP 代码
2015/05/13 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
javascript 精粹笔记
2010/05/09 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
2020/06/05 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
详解python之heapq模块及排序操作
2019/04/04 Python
Tensorflow 多线程设置方式
2020/02/06 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
pycharm 实现本地写代码,服务器运行的操作
2020/06/08 Python
Python特殊属性property原理及使用方法解析
2020/10/09 Python
Python内置函数及功能简介汇总
2020/10/13 Python
Python Unittest原理及基本使用方法
2020/11/06 Python
环保倡议书范文
2014/05/12 职场文书
新闻报道策划方案
2014/06/11 职场文书
精神病医院见习报告
2014/11/03 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA