详解基于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显示进度条的方法
Sep 20 Python
python使用any判断一个对象是否为空的方法
Nov 19 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
基于python socketserver框架全面解析
Sep 21 Python
Python实现读取字符串按列分配后按行输出示例
Apr 17 Python
Python比较配置文件的方法实例详解
Jun 06 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
python socket 聊天室实例代码详解
Nov 14 Python
python软件都是免费的吗
Jun 18 Python
Python 合并拼接字符串的方法
Jul 28 Python
python实现学生通讯录管理系统
Feb 25 Python
python使用shell脚本创建kafka连接器
Apr 29 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运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
php使用session二维数组实例
2014/11/06 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
2017/04/20 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
javascript之Partial Application学习
2013/01/10 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
IScroll5 中文API参数说明和调用方法
2016/05/21 Javascript
JS仿Base.js实现的继承示例
2017/04/07 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
微信小程序自定义音乐进度条的实例代码
2018/08/28 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
django实现分页的方法
2015/05/26 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
Django的HttpRequest和HttpResponse对象详解
2018/01/26 Python
Tensorflow 同时载入多个模型的实例讲解
2018/07/27 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
python re.match()用法相关示例
2021/01/27 Python
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
西式婚礼证婚词
2014/01/12 职场文书
公司离职证明样本
2014/09/13 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
教师自我剖析材料(四风问题)
2014/09/30 职场文书
高中优秀作文(范文)
2019/08/15 职场文书
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang