详解基于python的图像Gabor变换及特征提取


Posted in Python onOctober 26, 2020

1.前言

在深度学习出来之前,图像识别领域北有“Gabor帮主”,南有“SIFT慕容小哥”。目前,深度学习技术可以利用CNN网络和大数据样本搞事情,从而取替“Gabor帮主”和“SIFT慕容小哥”的江湖地位。但,在没有大数据和算力支撑的“乡村小镇”地带,或是对付“刁民小辈”,“Gabor帮主”可以大显身手,具有不可撼动的地位。IT武林中,有基于C++和OpenCV,或是基于matlab的Gabor图像变换与特征提取源代码,但大多招数花哨。而基于Python语言的Gabor图像变换和特征提取却很少见。本博主在实现基于Python语言的Gabor图像变换和特征提取中发现其确实比OpenCV或matlab务实,话少人狠,特和大家分享。

2. “Gabor帮主”简介

“Gabor帮主”最厉害的武器是Gabor滤波器,其最主要使用优势体现在对物体纹理特征的提取上。Gabor滤波器对于图像的亮度和对比度变化以及图像姿态变化具有较强的鲁棒性,并且它表达的是对图像识别最为有用的局部特征,故在计算机视觉及纹理分析领域中得到广泛的应用。Gabor滤波器可以提取不同方向和不同尺度的上的特征,并且进行随意组合,变幻莫测。下图为4个方向(0o,45o,90o,135o)和6个尺度(7,9,11,13,15,17),组合生成的24个Gabor滤波核。

详解基于python的图像Gabor变换及特征提取

3.“Gabor帮主”大招之图像变换

所谓Gabor图像变换就使用Gabor滤波器对图像进行滤波操作(相当于CNN中的卷积操作)得到新的图像。每个滤波核与图像滤波之后得到:

详解基于python的图像Gabor变换及特征提取

其中,λ为波,它的值以像素为单位指定,通常大于等于2。但不能大于输入图像尺寸的五分之一;
θ为方向,指定了Gabor函数并行条纹的方向,它的取值为0到2π;
ϕ为相位偏移,它的取值范围为−π到π。其中,0、π度分别对应中心对称的center-on函数和center-off函数,而-π/2和π/2对应反对称函数;
γ为长宽比,空间纵横比,决定了Gabor函数形状的椭圆率,当γ=1时,形状是圆的,当γ<1时,形状随着平行条纹方向而拉长,通常该值为0.5;
σ表示Gabor函数的高斯因子的标准差,它的值不能直接设置,它仅随着带宽b变化,带宽值必须是正实数,通常为1,此时,标准差和波长的关系为:σ=0.56λ;带宽(b):Gabor滤波器的半响应空间频率带宽:

详解基于python的图像Gabor变换及特征提取

x',y'的值为:

详解基于python的图像Gabor变换及特征提取

gabor滤波核是复数形式,因此可以把它分开成实部和虚部:

详解基于python的图像Gabor变换及特征提取
详解基于python的图像Gabor变换及特征提取

弄清以上公式原理后,大家也可以自己尝试利用Python把Gabor变换实现,源代码我这里就不贴了,如果大家感兴趣,可以参考https://3water.com/article/198212.htm。其实,skimage包中就有封装好的gabor变换函数,可以直接调用。因此,这里介绍一种简单偷懒的方式。从skimage中导入filters(from skimage import filters)后,便可调用gabor函数了,其函数说明如下:
skimage.filters.gabor(image, frequency, theta=0, bandwidth=1, sigma_x=None, sigma_y=None, n_stds=3, offset=0, mode=‘reflect', cval=0)
1)函数返回:
Gabor变换后的实部和虚部real,imag;大小与输入图像尺寸相同。
2)函数参数:
图像(image):二维数组输入图像(灰度图像);
频率(frequency):浮点谐波函数的空间频率,控制尺度;

详解基于python的图像Gabor变换及特征提取

,在图像特征提取领域通常取5个不同尺度

详解基于python的图像Gabor变换及特征提取

方向(theta):float,可选的弧度方向,如果为0,则谐波处于x方向;

详解基于python的图像Gabor变换及特征提取

,在图像特征提取领域通常取8个不同方向u=[0,1,2,3,4,5,6,7]。
带宽(bandwidth):浮点,可选由过滤器捕获的带宽。对于固定带宽,sigma_x和sigma_y将随着频率的增加而降低,如果用户设置了sigma_x和sigma_y,则该值将被忽略;标准偏差(sigma_x,sigma_y):float,x和y方向上的可选标准偏差;
内核的线性大小(n_stds):标量,可选内核的线性大小为n_stds(默认为3)标准偏差;偏移量(offset):浮点数,可选项以弧度表示的谐波函数的相位偏移;模式(mode):{‘constant',‘near',‘reflect',‘mirror',‘wrap'},可选用于将图像与内核进行卷积的模式,传递给ndi.convolve;cval:标量,可选值如果卷积模式为'不变',该参数被传递给ndi.convolve。
3)源代码如下:

import matplotlib.pyplot as plt
from skimage import filters,io,color
import numpy as np

filename='D:/lena.jpg'
img = io.imread(filename)#读取图像
img_gray = color.rgb2gray(img)#RGB转灰度
frequency=0.6
#调用gabor函数
real, imag = filters.gabor(img_gray, frequency=0.6,theta=45,n_stds=5)
#取模图像
img_mod=np.sqrt(real.astype(float)**2+imag.astype(float)**2)
#图像显示
plt.figure()
plt.subplot(2,2,1)
plt.imshow(img_gray,cmap='gray')
plt.subplot(2,2,2)
plt.imshow(img_mod,cmap='gray')
plt.subplot(2,2,3)
plt.imshow(real,cmap='gray')
plt.subplot(2,2,4)
plt.imshow(imag,cmap='gray')
plt.show()

4)运行结果如下:
详解基于python的图像Gabor变换及特征提取
5)注意事项
①通过theta参数调不同方向,这里输入是弧度,不是角度。②通过frequency参数调不同尺度变化。
6)利用skimage生成gobor卷积核:gabor_kernel
skimage.filters.gabor_kernel(frequency, theta=0, bandwidth=1, sigma_x=None, sigma_y=None, n_stds=3, offset=0)
函数返回:返回2D Gabor滤波器内核,包含实部与虚部。
参数与skimage.filters.gabor()函数相同。
源代码如下:

import matplotlib.pyplot as plt
from skimage import filters
gk = filters.gabor_kernel(frequency=0.1,theta=np.pi*30/180.0,n_stds=5)
mod=np.sqrt(gk.real.astype(float) ** 2 + gk.imag.astype(float) ** 2)
plt.figure()
plt.subplot(1,3,1)
plt.imshow(gk.real*255,cmap='gray')
plt.subplot(1,3,2)
plt.imshow(gk.imag*255,cmap='gray')
plt.subplot(1,3,3)
plt.imshow(mod*255,cmap='gray')
plt.show()

运行结果如下:

详解基于python的图像Gabor变换及特征提取

注意事项:①参数n_stds=3并不是说滤波核大小为(3,3),滤波核大小由参数frequency、theta、n_stds三个参数共同决定。②gabor_kernel函数返回是带有实部和虚部的复矩阵。③theta是弧度,不是角度

3.“Gabor帮主”大招之图像特征提取

Gabor滤波器可以在频域上不同尺度、不同方向上提取相关的特征。另外,Gabor函数与人眼的作用相仿,所以经常用作纹理识别上,并取得了较好的效果。Gabor特征提取一般包括取模、特征降维、特征归一化和特征选取等操作:
取模:skimage.filters.gabor()函数返回的是图像变换后的实部和虚部,在图像识别领域一般使用其模作为图像特征

详解基于python的图像Gabor变换及特征提取

2)特征降维:skimage.filters.gabor()函数返回值大小和原图像一样;另外,图像识别领域一般使用8个方向和5个尺度的gabor滤波器,得到40幅变换图像;导致提取的图像特征维度(40幅图像特征串联)比较高。因此,需要对取模图像进行降维处理。最简单的方法就是对每个模图像进行下采样,如使用Opencv中的resize函数cv2.resize(img,(0,0),fx=1/4,fy=1/4)。
3)特征归一化:
在机器学习领域中,不同评价指标(即特征向量中的不同特征就是所述的不同评价指标)往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。其中,最典型的就是数据的归一化处理。简而言之,归一化的目的就是使得预处理的数据被限定在一定的范围内。本博主介绍一种Z-score标准化方法:
当一化公式:

详解基于python的图像Gabor变换及特征提取

其中μ为所有样本数据的均值,σ为所有样本数据的标准差。
b)本方法要求原始数据的分布可以近似为高斯分布,否则归一化的效果会变得很糟糕;
c)应用场景:在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,Z-score standardization表现更好。
4)特征选取
经过以上三步后,可以将各模图像特征串联起来作为输入图像的特征向量。但此时得到的特征向量存在大量冗余,最好再进行一次特征降维(特征选取)操作。可以采用PCA或Fisher等线性子空间分析方法。
5)源代码:

import cv2
import numpy as np
from skimage import filters
filename='D:/lena.jpg'
img = cv2.imread(filename)#读图像
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转灰度
frequency=0.6
#gabor变换
real, imag = filters.gabor(img_gray, frequency=0.6,theta=45,n_stds=5)
#取模
img_mod=np.sqrt(real.astype(float)**2+imag.astype(float)**2)
#图像缩放(下采样)
newimg = cv2.resize(img_mod,(0,0),fx=1/4,fy=1/4,interpolation=cv2.INTER_AREA)
tempfea = newimg.flatten()#矩阵展平
tmean = np.mean(tempfea)#求均值
tstd = np.std(tempfea)#求方差
newfea = (tempfea - tmean)/tstd#数值归一化
print(newfea)

夜已深,公司都没有一个人了,空荡荡的。先写到这里吧,第一次在CSDN上发博文,有不到之处请指正,如果您觉得还有点用,请点个赞以支鼓励,不胜感激!!!!

到此这篇关于详解基于python的图像Gabor变换及特征提取的文章就介绍到这了,更多相关python Gabor变换及特征提取内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用python写的一个wordpress的采集程序
Feb 27 Python
Python中的if、else、elif语句用法简明讲解
Mar 11 Python
Pandas探索之高性能函数eval和query解析
Oct 28 Python
python处理csv中的空值方法
Jun 22 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
使用Python实现跳帧截取视频帧
May 31 Python
python+numpy按行求一个二维数组的最大值方法
Jul 09 Python
keras实现调用自己训练的模型,并去掉全连接层
Jun 09 Python
浅谈Python中的继承
Jun 19 Python
用python对oracle进行简单性能测试
Dec 05 Python
Python基本数据类型之字符串str
Jul 21 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
Python操作word文档插入图片和表格的实例演示
Oct 25 #Python
You might like
php自定义函数转换html标签示例
2016/09/29 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
python在控制台输出进度条的方法
2015/06/20 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
浅谈python爬虫使用Selenium模拟浏览器行为
2018/02/23 Python
python将一个英文语句以单词为单位逆序排放的方法
2018/12/20 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
Python基于yield遍历多个可迭代对象
2020/03/12 Python
jupyter notebook 增加kernel教程
2020/04/10 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
Python捕获异常堆栈信息的几种方法(小结)
2020/05/18 Python
Python实现GIF图倒放
2020/07/16 Python
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
超市后勤自我鉴定
2014/01/17 职场文书
公务员诚信承诺书
2014/05/26 职场文书
护理工作个人总结
2015/03/03 职场文书
工程部岗位职责范本
2015/04/11 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
MySQL中in和exists区别详解
2021/06/03 MySQL
React 高阶组件HOC用法归纳
2021/06/13 Javascript
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫