python实现Gabor滤波器-skimage(一)

article/2025/10/23 0:19:10
  • 什么是Gabor滤波器?
    Gabor滤波器是一种由正弦波调制的高斯核线性滤波器。Gabor滤波器的频率和方向表示与人类视觉系统相似。Gabor滤波器组通常用于计算机视觉和图像处理。特别适用于边缘检测和纹理分类。一个二维Gabor滤波器是一个由正弦平面波调制的高斯核函数。好处是对光强不敏感,十分适合纹理分析。

  • Gabor的原理?
    公式繁琐不写了,详细可以参考Gabor滤波器

  • Gabor滤波器怎么应用与纹理分析?
    Gabor滤波器提取纹理特征主要包括两个过程:①设计滤波器(例如函数、数目、方向和间隔);②从滤波器的输出结果中提取有效纹理特征集
    实际行动中需注意:
    1、选择不同方向下的Gabor滤波器
    与检测对象趋势相同的方向参数可以使特征点的定位更加准确。
    2、选择不同频率下的滤波器
    当滤波器纹理与图像作用时,滤波器覆盖下的局部纹理频率与滤波器的频率越接近响应就越大,反之越小。
    3、不同的卷积核(kernel size)大小对Gabor滤波核的影响
    如果卷积核的边长小于波长,那么整个波形不能包括在卷积核中,使得波形边缘的滤波效果起不到作用。相反,如果如果卷积核的边长大于波长,则不会对滤波器产生什么影响。
    4、相位变化对Gabor滤波核的影响
    通过相位变化可以改变滤波核中心点的波形,如果滤波核中心点正对波峰(ϕ=0ϕ=0),则会对整张图像起到加强的作用,如果滤波核中心点正对波谷(ϕ=180ϕ=180),则会对整张图像起到减弱的作用。我们应当避免滤波核中心点的波形位于零交叉点,因为这样我们可能会看不到滤波器的任何效果。
    5、不同方向不同尺度的Gabor滤波器可以提取对象中的不同特征

  • 实际如何进行特征提取与应用?
    以使用skimage.filters.gabor来进行不重复造车。下面的例子是官方给的,展示了如何基于Gabor滤波器组对纹理进行分类。详细可见Gabor filter banks for texture classification。
    一般来说,Gabor分为实部和虚部,用实部进行滤波后图像会平滑;虚部滤波后用来检测边缘。本例中Gabor滤波器的频率和方向表示选择与人类视觉系统相似的。利用各种不同的Gabor滤波核的 实部 对图像进行滤波。然后将 滤波后 图像的 均值和方差 作为分类特征,为简单起见,该特征基于最小平方误差
    在进行实例前,先学习两个函数:
    1、skimage.filters.gabor(image, frequency, theta=0, bandwidth=1, sigma_x=None, sigma_y=None, n_stds=3, offset=0, mode='reflect', cval=0)
    用途: 将Gabor滤波核的实部和虚部应用于图像,并将响应作为一对数组返回。
    参数:
    image:2-D array
    输入图像(2维)
    frequency:float
    谐波函数的空间频率. Specified in pixels.
    theta:float, optional
    方向以弧度制。如果是0,谐波在x方向上。
    bandwidth:float, optional
    滤波器捕获的带宽。在带宽固定的情况下,sigma_x和sigma_y会随着频率的增加而减小。如果sigma_x和sigma_y由用户设置,则忽略此值。
    sigma_x, sigma_y:float, optional
    x和y方向上的标准差。这些方向适用于旋转前的核。如果 t h e t a = 1 / 2 ∗ p i theta= 1/2*pi theta=1/2pi,那么核旋转90度,sigma_x控制垂直方向。
    n_stds:scalar, optional
    内核的线性大小是n_stds(默认为3)标准差。
    offset:float, optional
    谐波函数的相位偏移以弧度制。
    mode:{‘constant’, ‘nearest’, ‘reflect’, ‘mirror’, ‘wrap’}, optional
    用于图像与内核卷积的模式,传递给ndi.convolve
    cval:scalar, optional
    如果卷积模式是“constant”常数,则指定该常数值。该参数被传递给ndi.convolve。
    2、skimage.filters.gabor_kernel(frequency, theta=0, bandwidth=1, sigma_x=None, sigma_y=None, n_stds=3, offset=0, dtype=<class 'numpy.complex128'>)
    用途: 返回复杂的2D-Gabor过滤器内核。
    Gabor核是由复杂的谐波函数调制的高斯核。谐波函数由虚正弦函数和实余弦函数组成。空间频率与谐波的波长和高斯核的标准差成反比。带宽也与标准差成反比。
    参数:
    frequency:float
    谐波函数的空间频率。
    theta:float, optional
    方向以弧度制。如果是0,谐波在x方向上。
    bandwidth:float, optional
    滤波器捕获的带宽。在带宽固定的情况下,sigma_x和sigma_y会随着频率的增加而减小。如果sigma_x和sigma_y由用户设置,则忽略此值。
    sigma_x, sigma_y:float, optional
    滤波器捕获的带宽。在带宽固定的情况下,sigma_x和sigma_y会随着频率的增加而减小。如果sigma_x和sigma_y由用户设置,则忽略此值。
    n_stds:scalar, optional
    内核的线性大小是n_stds(默认为3)标准差
    offset:float, optional
    谐波函数的相位偏移以弧度制。
    dtype{np.complex64, np.complex128}
    指定过滤器是单精度复数还是双精度复数。

import matplotlib.pyplot as plt
import numpy as np
from scipy import ndimage as ndifrom skimage import data#引入数据
from skimage.util import img_as_float
from skimage.filters import gabor_kernel#引入Gabor核# 准备滤波器的核,这里采用了16个核
kernels = []
for theta in range(4):theta = theta / 4. * np.pi#核的方向(0,45,90,135)for sigma in (1, 3):for frequency in (0.05, 0.25):kernel = np.real(gabor_kernel(frequency, theta=theta,sigma_x=sigma, sigma_y=sigma))kernels.append(kernel)
#这样就建立了16个kernel.theta4*sigma2*frequency2=16种组合情况shrink = (slice(0, None, 3), slice(0, None, 3))
brick = img_as_float(data.brick())[shrink]#提取到砖材质图像
grass = img_as_float(data.grass())[shrink]#提取到草材质图像
gravel = img_as_float(data.gravel())[shrink]#提取到砂石材质图像
image_names = ('brick', 'grass', 'gravel')
images = (brick, grass, gravel)
def compute_feats(image, kernels):#计算特征函数feats = np.zeros((len(kernels), 2), dtype=np.double)#选择在过滤后以均值和方差作为特征,所以有两个for k, kernel in enumerate(kernels):filtered = ndi.convolve(image, kernel, mode='wrap')#将图像和Gabor核进行卷积feats[k, 0] = filtered.mean()#将过滤后的进行平均值feats[k, 1] = filtered.var()#进行方差return feats
#准备参考特性
ref_feats = np.zeros((3, len(kernels), 2), dtype=np.double)#3种材质,16个核,2种特征表示
ref_feats[0, :, :] = compute_feats(brick, kernels)
ref_feats[1, :, :] = compute_feats(grass, kernels)
ref_feats[2, :, :] = compute_feats(gravel, kernels)def match(feats, ref_feats):#匹配函数,用于计算最小平方误差min_error = np.infmin_i = Nonefor i in range(ref_feats.shape[0]):error = np.sum((feats - ref_feats[i, :])**2)if error < min_error:min_error = errormin_i = ireturn min_iprint('Rotated images matched against references using Gabor filter banks:')print('original: brick, rotated: 30deg, match result: ', end='')
feats = compute_feats(ndi.rotate(brick, angle=190, reshape=False), kernels)
print(image_names[match(feats, ref_feats)])
print('original: brick, rotated: 70deg, match result: ', end='')
feats = compute_feats(ndi.rotate(brick, angle=70, reshape=False), kernels)
print(image_names[match(feats, ref_feats)])
print('original: grass, rotated: 145deg, match result: ', end='')
feats = compute_feats(ndi.rotate(grass, angle=145, reshape=False), kernels)
print(image_names[match(feats, ref_feats)])#计算规范化以后的对应核的power图
def power(image, kernel):#对图像进行规范化,以便更好地进行比较image = (image - image.mean()) / image.std()return np.sqrt(ndi.convolve(image, np.real(kernel), mode='wrap')**2 +ndi.convolve(image, np.imag(kernel), mode='wrap')**2)# 绘制筛选滤波器组核及其响应的图。
results = []
kernel_params = []
for theta in (0, 1):theta = theta / 4. * np.pifor frequency in (0.1, 0.4):kernel = gabor_kernel(frequency, theta=theta)params = 'theta=%d,\nfrequency=%.2f' % (theta * 180 / np.pi, frequency)#核的标题kernel_params.append(params)# 保存每个图像的kernel和power图像results.append((kernel, [power(img, kernel) for img in images]))#设定各个子图像的位置
fig, axes = plt.subplots(nrows=5, ncols=4, figsize=(5, 6))
plt.gray()
fig.suptitle('Image responses for Gabor filter kernels', fontsize=12)
axes[0][0].axis('off')# 绘制原始图像
for label, img, ax in zip(image_names, images, axes[0][1:]):ax.imshow(img)ax.set_title(label, fontsize=9)ax.axis('off')for label, (kernel, powers), ax_row in zip(kernel_params, results, axes[1:]):# 绘制Gabor核ax = ax_row[0]ax.imshow(np.real(kernel))ax.set_ylabel(label, fontsize=7)ax.set_xticks([])ax.set_yticks([])# 绘制Gabor响应,每个滤波器使用对比度归一化vmin = np.min(powers)vmax = np.max(powers)for patch, ax in zip(powers, ax_row[1:]):ax.imshow(patch, vmin=vmin, vmax=vmax)ax.axis('off')

结果如下图所示:可以看到不同的滤波器设定,得到的特征相应完全不同。所以对于具体的问题应该具体分析应该采用怎么样的滤波器参数。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/y0ZPYo0R.shtml

相关文章

二维gabor滤波器matlab,在matlab中使用可分离的Gabor滤波器

如果过滤器g可以表示为两个向量grow和gcol的乘法&#xff0c;则称为可分离过滤器。使用一维滤波器将二维滤波器的计算复杂度从O(M^2 N^2)降低到O(2M N^2)&#xff0c;其中M和N分别是滤波器掩码和图像的宽度(和高度)。 在this stackoverflow link中&#xff0c;我在空间域中编写…

gabor滤波器简要介绍

在经过一天的浏览csdn&#xff0c;博客园后&#xff0c;总算是对gabor滤波器有了一个大概的了解&#xff0c;所以趁还热着&#xff0c;赶紧记录一下。 写的话&#xff0c;先给自己梳理下要写什么吧&#xff1a; 1. 什么是gabor滤波器&#xff0c;公式定义 2. gabor滤波器的代码…

MATLAB---一维Gabor滤波器、gabor滤波器的实部与虚部图像、Gabor滤波器

%% 一维Gabor滤波器 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 x-4:0.01:4; t1; y1*exp(-(x.^2)./(sqrt(2*pi)*t^2)); plot(x,y,b,linewidth,2); hold on x1-4:0.01:4; y11*sin(9*x1pi…

有关Gabor滤波器

有关Gabor Gabor特征是一种可以用来描述图像纹理信息的特征。此外,Gabor小波对于图像的边缘敏感,\能够提供良好的方向选择和尺度选择特性,可以在频域不同尺度、不同方向上提取相关的特征。Gabor滤波器可以提取不同方向上的纹理信息。Gabor滤波器对于光照变化不敏感,能够提供…

基于Gabor滤波器的图像边缘检测实验

1 Gabor滤波算法原理 Gabor核函数定义&#xff1a; 式中&#xff1a;依次作为主轴方向上的高斯尺度、主轴方向正交的高斯尺度&#xff0c; 是滤波器的中心频率&#xff1b;是调制平面波以及高斯主轴旋转的角度&#xff0c;它沿着逆时针方向&#xff0c;和是常数。Gabor滤波器…

版本管理工具git常用命令

一、git是什么&#xff0c;⽤来做什么 git是分布式版本控制系统&#xff0c;⽤来进⾏版本管理 ⼆、git有什么特点 git VS svn git是分布式&#xff0c;svn是集中式。分布式版本系统的最⼤好处之⼀是在本地⼯作完全不需要考 虑远程库的存在&#xff0c;也就是有没有联⽹都可以…

Git 代码版本管理工具详解 进厂必备

目录 前言Git 概述什么是版本控制&#xff1f;为什么需要版本控制&#xff1f;版本控制工具集中式分布式 Git 工作机制Git安装Git 常用命令(部分)初始化本地库设置用户签名初始化本地库查看本地库状态***工作区代码编写***添加暂存区撤销工作区的修改***提交本地库***工作区修改…

代码版本管理工具Git

Git 的发展历史 在做一个项目工程的时候&#xff0c;代码总是不断地更新&#xff0c;于是你就可能一边写代码&#xff0c;一边就为你的代码创建了很多的版本文件夹&#xff0c;分别叫“项目 0.1”、“项目 0.2”、“项目 0.3”、“项目 1.0”之类的名字&#xff0c;让你可以区…

Git分布式版本管理工具

Git_1_概述 1.特性 能够记录历史版本,回退历史版本团队开发,方便代码合并 2.介绍(摘自维基百科) git是一个分布式版本控制软件&#xff0c;最初由林纳斯托瓦兹创作&#xff0c;于2005年以GPL许可协议发布。最初目的是为了更好地管理Linux内核开发而设计。应注意的是&#xf…

Node版本管理工具

前些天在公司的时候&#xff0c;由于业务需求需要降低node的版本&#xff0c;但是网上找了一大堆教程&#xff0c;windows电脑都无法使用&#xff0c;没办法自己研究了一下&#xff0c;成功在自己电脑上安装了多个版本的node&#xff0c;几个命令就能切换&#xff0c;那么就让我…

软件测试——版本管理工具:SVN和Git

软件测试——版本管理工具&#xff1a;SVN和Git SVNSVN的安装和介绍SVN的安装操作冲突 GitGit的安装和配置git的命令行用法git 代码冲突 持续集成和持续交付定义目的持续集成和持续交付实施模型分析 SVN SVN是开放源代码的版本控制系统集中式的含义是指&#xff1a;所有的文件…

版本管理工具介绍—Git篇

一.版本管理工具作用 主要讲解了git在各平台的安装和基本使用&#xff0c;Git能够帮助我们解决文件的提交、检出、回溯历史、冲突解决、多人协作模式等问题&#xff0c;并且大大提升我们的工作效率。 版本管理工具是干什么的&#xff1f; 1.备份文件 2.历史记录 3.回到过去…

版本管理的使用

gitlab的使用 gitlab是一个代码仓库&#xff0c;类似于github&#xff0c;只不过gitlab是私有的&#xff0c;一般部署在公司内部的服务器上 网站设置为中文页面 点击右上角的头像&#xff0c;点击弹出框的Preferences菜单&#xff0c;如下图&#xff1a; 打开页面后&#xff0…

2. 版本管理

文章目录 2.1 一句话总结Git2.2 可以完成哪些功能&#xff1f;2.3 主流版本控制工具/软件2.4 版本控制分类2.4.1 本地版本控制2.4.2 集中版本控制2.4.3 分布式版本控制 2.5 Git VS SVN2.5.1 SVN2.5.2 Git 2.1 一句话总结Git 在开发的过程中用于管理对文件、目录或工程等内容的…

软件版本管理

修订说明 1.PC端产品内部版本号管理说明 为了规范产品管理&#xff0c;提高产品质量&#xff0c;特制定产品版本规则。产品从版本上分为主版本和分支版本&#xff0c;从稳定程度上分为每日构建、内部测试版(alpha测试)、Beta测试版、稳定版。 所有的版本命名均遵循以下规则&a…

Git版本管理工具使用详细介绍

一、引言 跟你们吐槽一下&#xff0c;最近小编的工作制度也改成996&#xff0c;怎么说&#xff1f; 是好是坏呢&#xff1f; 网上很多小伙伴也在吐槽&#xff0c;刚开始小编也是挺反感的&#xff0c;毕竟之前周末一些坚持的习惯&#xff0c;因此都需要改变。 既然公司选择了996…

Git—版本管理工具

作用&#xff1a;分布式版本控制 一句话&#xff1a;在开发的过程中用于管理对文件、目录或工程等内容的修改历史&#xff0c;方便查看历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术 官网下载安装&#xff1a;https://git-scm.com/ 命令大全&#xff1a;https://g…

常见的版本控制工具

常见的版本控制工具 我们学习的东西&#xff0c;一定是当下最流行的&#xff01; 主流的版本控制器有如下这些&#xff1a; Git SVN&#xff08;Subversion&#xff09; CVS&#xff08;Concurrent Versions System&#xff09; VSS&#xff08;Micorosoft Visual SourceS…

git版本管理工具

文章目录 1&#xff1a;安装1&#xff1a;设置信息 2&#xff1a;初始化本地项目仓库2.1&#xff1a;本地仓库目录解释 3&#xff1a;git基本原理1&#xff1a;本地流程原理图2&#xff1a;分支合并&#xff1a;merge和rebase3&#xff1a;命令解释 4&#xff1a;git-gui界面操…

项目管理中,如何对各种文件进行统一版本管理?

不知道你在工作中是否也遇到过这样的问题&#xff1a; 1、文件先存一个位置&#xff0c;等晚点再整理&#xff0c;结果过了一段时间&#xff0c;就变成了这样&#xff1a; 2、想从电脑中找一份重要材料&#xff0c;要花费很长时间&#xff0c;有时查找一通&#xff0c;却一无所…