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

  • 1.前言
  • 2. “Gabor帮主”简介
  • 3.“Gabor帮主”大招之图像变换
  • 3.“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 npfilename='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变换及特征提取相关推荐

  1. 基于Python的图像超分辨率(Image Super Resolution)

    资源下载地址:https://download.csdn.net/download/sheziqiong/85596189 一.业务背景 本实验将使用时深度学习技术对图像进行超分辨率重建,设计到的技术 ...

  2. 基于Python实现图像相似度检测【100010088】

    一.实验目的和要求 基于一张样板图片,对九张其他图像进行相似度的计算,得到"最相似"的一张图片.尝试多种算法,并对图像检索方法进行探索. 要求:基于 PIL 库或者 OpenCV ...

  3. 基于 Python 的图像分类项目实践入门

    课程目标 CO1:  学习并掌握图像分类项目的语法基础.深度学习基础 CO2:  通过学习和完成图像分类项目 ,初步掌握应用 python 语言调用模型并完成特定图像分类的能力. CO3 :培养学生在 ...

  4. 基于Python查找图像中最常见的颜色

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 如果我们能够得知道一幅图像中最多的颜色是什么的话,可以帮助我们解决 ...

  5. 基于Python的图像拉普拉斯变化/图像锐化实现

    博主本学习选修数字图像处理课程,用到的教材是冈萨雷斯的<数字图像处理>,作业要求完成图像拉普拉斯变化,虽然用Matalb比较容易就能实现,但还是想尝试用python完成. Python+O ...

  6. 模式识别作业,基于python提取图像纹理特征

    其中的直方图的绘画部分要注意,只写了部分的直方图代码###直接调用skimag库中的函数BLP提取纹理 from skimage import dataimport matplotlib.pyplot ...

  7. python opencv高斯滤波_【OpenCV】基于Python的图像高斯平滑和椒盐噪声处理 | 学步园...

    最近要做一个Project,是使用TV来对添加了Gaussian和Salt&Pepper噪声的图像进行恢复,前期的任务是生成噪声污染的图像. 噪声图像的生成采用对图像进行高斯平滑,之后在随机的 ...

  8. 基于python的图像二值化处理(opencv)

    图像二值化处理 (python-opencv) 二值化 图像的二值化,在图像处理中是十分重要的一个步骤.是几乎所有后续的图像处理的基础和前提.只有根据不同场景选择不同的二值化处理,才能对一幅图片较好的 ...

  9. python 傅里叶_基于python的图像傅里叶处理

    import numpy as np import matplotlib.pyplot as plt x = np.linspace(-10, 10, 1000) a = np.cos(x) b = ...

最新文章

  1. 专家:端午将至湖北地区挂马网站激增 用户需警惕
  2. 敏捷之道Scrum篇
  3. 无障碍开发(二)之ARIA role属性
  4. DCMTK:图像服务器中央测试节点(ctn)主程序
  5. 给easyui datagrid 添加mouseover和mouseout事件
  6. PAT乙级 1033 旧键盘打字 (20 分)
  7. linux目录文件变化,Linux下监测目录或文件的变化---inotify
  8. 蓝牙学习笔记(五)——AC692x_BLE工具make_gatt_services
  9. [POJ2406]字符串的幂
  10. Visual Studio 2011 Beta新特性(一):安装VS2011
  11. vb.net的socket编程
  12. java+MySQL 基于ssm的眼镜销售购物商城
  13. FastDFS原理及工作流程
  14. flac音乐格式怎么转换mp3?
  15. libuv之msys2环境下编译
  16. 华为微型计算机,8英寸华为平板M5青春版今日发布
  17. SAP FIに関する専門用語①
  18. 苹果神武4手游等待服务器响应,ios回合制手游《神武4》如何在登高探宝中快速拿到奖励?...
  19. 黑马程序员--C语言基础之--变量、内部函数与外部函数
  20. 基于python编码实现多智能体进化算法求解带硬时间窗约束的VRP问题(适配版)

热门文章

  1. 回归预测 | MATLAB实现ELM极限学习机多输入单输出
  2. js获取json文件内容
  3. input的tabindex属性
  4. c++ const 用法
  5. shell脚本编写计算器
  6. C语言 将一串数字,一个一个输出
  7. 网易云爬虫系列-打印歌词
  8. 【测试环境】cywin的简单介绍
  9. 输入自然数n,将n分解为质因子连乘的形式输出。例如:输入756,则显示为756=2*2*3*3*3*7
  10. 拜占庭容错(BFT)介绍