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

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滤波核。

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

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

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

x',y'的值为:

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


弄清以上公式原理后,大家也可以自己尝试利用Python把Gabor变换实现,源代码我这里就不贴了,如果大家感兴趣,可以参考https://www.cnblogs.com/wojianxin/p/12574089.html。其实,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):浮点谐波函数的空间频率,控制尺度;

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

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

,在图像特征提取领域通常取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)运行结果如下:

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()

运行结果如下:

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

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

Gabor滤波器可以在频域上不同尺度、不同方向上提取相关的特征。另外,Gabor函数与人眼的作用相仿,所以经常用作纹理识别上,并取得了较好的效果。Gabor特征提取一般包括取模、特征降维、特征归一化和特征选取等操作:
取模:skimage.filters.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标准化方法:
当一化公式:

其中μ为所有样本数据的均值,σ为所有样本数据的标准差。
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变换及特征提取内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Opencv-Python图像透视变换cv2.warpPerspective的示例

    Opencv-Python图像透视变换cv2.warpPerspective 代码如下: # -*- coding:utf-8 -*- import cv2 import numpy as np import sys img = cv2.imread('test.jpg') # cv2.imshow("original", img) # 可选,扩展图像,保证内容不超出可视范围 img = cv2.copyMakeBorder(img, 200, 200, 200, 200, cv2.B

  • python opencv 图像尺寸变换方法

    利用Python OpenCV中的 cv.Resize(源,目标,变换方法)就可以实现变换为想要的尺寸了 源文件:就不用说了 目标:你可以对图像进行倍数的放大和缩小 也可以直接的输入尺寸大小 变换的方法: CV_INTER_NN - 最近邻插值, CV_INTER_LINEAR - 双线性插值 (缺省使用) CV_INTER_AREA - 使用象素关系重采样.当图像缩小时候,该方法可以避免波纹出现.当图像放大时,类似于 CV_INTER_NN 方法.. CV_INTER_CUBIC - 立方插值

  • Python数字图像处理之霍夫线变换实现详解

    在图片处理中,霍夫变换主要是用来检测图片中的几何形状,包括直线.圆.椭圆等. 在skimage中,霍夫变换是放在tranform模块内,本篇主要讲解霍夫线变换. 对于平面中的一条直线,在笛卡尔坐标系中,可用y=mx+b来表示,其中m为斜率,b为截距.但是如果直线是一条垂直线,则m为无穷大,所有通常我们在另一坐标系中表示直线,即极坐标系下的r=xcos(theta)+ysin(theta).即可用(r,theta)来表示一条直线.其中r为该直线到原点的距离,theta为该直线的垂线与x轴的夹角.如

  • Python实现图像几何变换

    本文实例讲述了Python实现图像几何变换的方法.分享给大家供大家参考.具体实现方法如下: import Image try: im=Image.open('test.jpg') #out = im.resize((128, 128)) #改变大小 #out = im.rotate(45) #45°旋转 #out = im.transpose(Image.FLIP_LEFT_RIGHT) #水平翻转 #out = im.transpose(Image.FLIP_TOP_BOTTOM) #垂直翻转

  • Python图像灰度变换及图像数组操作

    使用python以及numpy通过直接操作图像数组完成一系列基本的图像处理 numpy简介: NumPy是一个非常有名的 Python 科学计算工具包,其中包含了大量有用的工具,比如数组对象(用来表示向量.矩阵.图像等)以及线性代数函数. 数组对象可以实现数组中重要的操作,比如矩阵乘积.转置.解方程系统.向量乘积和归一化.这为图像变形.对变化进行建模.图像分类.图像聚类等提供了基础. 在上一篇python基本图像操作中,当载入图像时,通过调用 array() 方法将图像转换成NumPy的数组对象

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

    1.前言 在深度学习出来之前,图像识别领域北有"Gabor帮主",南有"SIFT慕容小哥".目前,深度学习技术可以利用CNN网络和大数据样本搞事情,从而取替"Gabor帮主"和"SIFT慕容小哥"的江湖地位.但,在没有大数据和算力支撑的"乡村小镇"地带,或是对付"刁民小辈","Gabor帮主"可以大显身手,具有不可撼动的地位.IT武林中,有基于C++和OpenCV,或

  • 详解基于python的全局与局部序列比对的实现(DNA)

    程序能实现什么 a.完成gap值的自定义输入以及两条需比对序列的输入 b.完成得分矩阵的计算及输出 c.输出序列比对结果 d.使用matplotlib对得分矩阵路径的绘制 一.实现步骤 1.用户输入步骤 a.输入自定义的gap值 b.输入需要比对的碱基序列1(A,T,C,G)换行表示输入完成 b.输入需要比对的碱基序列2(A,T,C,G)换行表示输入完成 输入(示例): 2.代码实现步骤 1.获取到用户输入的gap,s以及t 2.调用构建得分矩阵函数,得到得分矩阵以及方向矩阵 3.将得到的得分矩

  • 详解基于python的多张不同宽高图片拼接成大图

    半年前写过一篇将多张图片拼接成大图的博客,是讲的把所有图片先转换为256×256的图片后再进行拼接,今天看到一个朋友的评论说如何拼接非正方形图片,如47×57,之前有个朋友也问过这个,我当时理解错了,以为是要把不同尺寸的照片如32×45.56×75等拼接成大图,当时还纳闷,那不是很难看吗,还得填充非图片元素,emmm,只怪当年太天真.. 于是乎搞了下非方形图片的拼接,上代码: #!/usr/bin/env python # -*- coding:utf-8 -*- import PIL.Imag

  • 基于YUV 数据格式详解及python实现方式

    YUV 数据格式概览 YUV 的原理是把亮度与色度分离,使用 Y.U.V 分别表示亮度,以及蓝色通道与亮度的差值和红色通道与亮度的差值.其中 Y 信号分量除了表示亮度 (luma) 信号外,还含有较多的绿色通道量,单纯的 Y 分量可以显示出完整的黑白图像.U.V 分量分别表示蓝 (blue).红 (red) 分量信号,它们只含有色彩 (chrominance/color) 信息,所以 YUV 也称为 YCbCr,C 意思可以理解为 (component 或者 color). 维基百科上的 RGB

  • 详解基于Android的Appium+Python自动化脚本编写

    1.Appium Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试, 它使用WebDriver协议驱动iOS,Android和Windows应用程序. 通过Appium,我们可以模拟点击和屏幕的滑动,可以获取元素的id和classname,还可以根据操作生成相关的脚本代码. 下面开始Appium的配置. appPackage和APPActivity的获取 任意下载一个app 解压 但是解压出来的xml文件可能是乱码,所以我们需要反编译文件. 逆向AndroidMan

  • 详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用

    人脸识别技术已经相当成熟,面对满大街的人脸识别应用,像单位门禁.刷脸打卡.App解锁.刷脸支付.口罩检测........ 作为一个图像处理的爱好者,怎能放过人脸识别这一环呢!调研开搞,发现了超实用的Facecognition!现在和大家分享下~~ Facecognition人脸识别原理大体可分为: 1.通过hog算子定位人脸,也可以用cnn模型,但本文没试过: 2.Dlib有专门的函数和模型,实现人脸68个特征点的定位.通过图像的几何变换(仿射.旋转.缩放),使各个特征点对齐(将眼睛.嘴等部位移

  • 详解基于深度学习的两种信源信道联合编码

    概述 经典端对端无线通信系统如下图所示: 信源 xx使用信源编码,去除冗余得到比特流 ss. 对 ss进行信道编码(如 Turbo.LDPC 等)得到 yy,增加相应的校验位来抵抗信道噪声. 对比特流 yy进行调制(如 BPSK.16QAM 等)得到 zz,并经物理信道发送. 接收端对经信道后的符号 \bar{z}zˉ 进行解调.解码操作得到 \bar{x}xˉ. 根据定义信道方式不同,基于深度学习的信源信道联合编码(Deep JSCC)可以分为两类. 第一类,受无编码传输的启发,将信源编码.信

  • 详解在Python中使用OpenCV进行直线检测

    目录 1.引言 2.霍夫变换 3.举个栗子 3.1读入图像进行灰度化 3.2执行边缘检测 3.3进行霍夫变换 补充 1. 引言 在图像处理中,直线检测是一种常见的算法,它通常获取n个边缘点的集合,并找到通过这些边缘点的直线.其中用于直线检测,最为流行的检测器是基于霍夫变换的直线检测技术. 2. 霍夫变换 霍夫变换是图像处理中的一种特征提取方法,可以识别图像中的几何形状.它将在参数空间内进行投票来决定其物体形状,通过检测累计结果找到一极大值所对应的解,利用此解即可得到一个符合特定形状的参数. 在使

  • 详解用Python进行时间序列预测的7种方法

    数据准备 数据集(JetRail高铁的乘客数量)下载. 假设要解决一个时序问题:根据过往两年的数据(2012 年 8 月至 2014 年 8月),需要用这些数据预测接下来 7 个月的乘客数量. import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv('train.csv') df.head() df.shape 依照上面的代码,我们获得了 2012-2014 年两年每个小时的乘

随机推荐