Python OpenCV实现Log Gabor滤波器(由LGHD描述符扩展)

article/2025/10/23 0:30:21

引言

笔者在研究红外图像与可见光图像配准时接触到了很多描述符,其中关于LGHD描述符的Log Gabor滤波器很有意思,与大家分享

LGHD(Log-Gabor Histogram Descriptor)

描述符的思想是基于高频分量分布的描述符对于不同的非线性强度变化具有鲁棒性。可以理解为虽然非线性强度差异可以影响图像,但是场景中所包含对象的形状的整体外观仍趋于保持恒定。Log-Gabor 滤波器是根据Gabor滤波器衍生而来,Gabor变换能达到时频局部化的目的,它能够在整体上提供信号的全部信息又能提供在任意局部时间内信号变化剧烈程度的信息。

Log-Gabor滤波器

Log-Gabor 滤波器的表达是从Gabor衍生而来的,相比于Gabor滤波器,它的传递函数是对数频率尺度下的高斯函数,始终没有直流分量,在图像处理时可以不受亮度的影响。
并经研究Log-Gabor函数更符合哺乳动物的视觉观察系统,有更优的纹理提取、目标检测效果。
Log-Gabor的传递函数为:
G ( ω ) = e − log ⁡ ( ω / ω 0 ) 2 / ( 2 ( log ⁡ ( k / ω 0 ) 2 ) ) G(\omega)=e^{-\log(\omega/\omega_0)^2/(2(\log(k/\omega_0)^2))} G(ω)=elog(ω/ω0)2/(2(log(k/ω0)2))
Log-Gabor函数并不能在空间域中得到表达式,滤波器的构造须在频域中。对图像来说,在空域的卷积等价于在频域的乘积,所以我们直接创建与图像大小相同的Log-Gabor滤波器,在频域中完成图像处理,之后再回到空域中进行统计。一个二维的Log-Gabor滤波器可以分解为径向滤波器和角度滤波器两部分,对应极坐标公式为:
Alan_Liang
完整的Log-Gabor滤波器由这两部分相乘得到:
在这里插入图片描述
其中r是经向坐标, θ \theta θ为角度坐标, f 0 , θ 0 f_0,\theta_0 f0,θ0分别为滤波器中心频率和方向角度,参数可 σ r , σ θ \sigma_r,\sigma_\theta σr,σθ分别用于决定滤波器的径向带宽和角度带宽。对提供波长的滤波器,频率由滤波器的波长设置,在不同尺度下,其转换公式为:
在这里插入图片描述
在这里我将6个方向4个尺度的Log-Gabor 滤波器做展示,滤波器与图像的大小相同,一般情况下将图像进行FFT变换后与滤波器对应位相乘,再转换至空域,就是滤波后的图像效果。

构造滤波器

import cv2
import numpy as np
import matplotlib.pyplot as pltn_scales=4
n_angles=6
img = cv2.imread("img_path")
H,W,_ = ir_img.shapedef lowpassfilter(H, W, cutoff, n):if cutoff < 0 or cutoff > 0.5:raise ValueError('the cutoff frequency needs to be between 0 and 0.5')if not n == int(n) or n < 1.0:raise ValueError('n must be an integer >= 1')xrange = np.linspace(-0.5, 0.5, W)yrange = np.linspace(-0.5, 0.5, H)x, y = np.meshgrid(xrange, yrange)radius = np.sqrt(x ** 2 + y ** 2)radius = np.fft.ifftshift(radius)return 1.0 / (1.0 + (radius / cutoff) ** (2 * n))xrange = np.linspace(-0.5, 0.5, W)
yrange = np.linspace(-0.5, 0.5, H)
x, y = np.meshgrid(xrange, yrange)
radius = np.sqrt(x ** 2 + y ** 2)
theta = np.arctan2(-y, x)# numpy.fft模块中的fftshift函数可以将FFT输出中的直流分量移动到频谱的中央。ifftshift函数则是其逆操作
radius = np.fft.ifftshift(radius)
theta = np.fft.ifftshift(theta)sintheta = np.sin(theta)
costheta = np.cos(theta)lp_filter = lowpassfilter(H, W, 0.45, 15)
# lp_filter = np.fft.ifftshift(lp_filter)
log_gabor_filters = np.zeros((n_scales, H, W))#  不同尺度
for sc in range(n_scales):wavelength = min_wavelength * multiplier ** sclog_gabor_filters[sc] = np.exp((-(np.log(radius * wavelength + 1e-5)) ** 2) / (2 * np.log(sigma_onf + 1e-5) ** 2)) * lp_filterspreads = np.zeros((n_angles, H, W))
#  不同方向
for o in range(n_angles):angle = o * np.pi / n_anglesds = sintheta * np.cos(angle) - costheta * np.sin(angle)dc = costheta * np.cos(angle) + sintheta * np.sin(angle)dtheta = abs(np.arctan2(ds, dc))dtheta = np.minimum(dtheta * n_angles * 0.5, np.pi)spreads[o] = (np.cos(dtheta) + 1) / 2
#  构造集合的filter
filter_bank = np.zeros((n_scales * n_angles, H, W))
for sc in range(n_scales):for o in range(n_angles):filter_bank[sc * n_angles + o] = log_gabor_filters[sc] * spreads[o]#  可视化
for sc in range(n_scales):plt.figure(sc,figsize=(30,120))first = filter_bank[sc * n_angles] - np.min(filter_bank[sc * n_angles])first /= np.max(first)first *= 255shuiping = firstfor o in range(n_angles-1):out = filter_bank[sc * n_angles + o+1] - np.min(filter_bank[sc * n_angles + o+1])out /= np.max(out)out *= 255shuiping = np.hstack((shuiping,out))plt.imshow(shuiping,cmap="gray")

滤波器可视化

在这里插入图片描述

进行图像测试

原图
在这里插入图片描述

vi_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 图像的傅里叶变换
image_fft = cv2.dft(np.float32(vi_gray), flags=cv2.DFT_COMPLEX_OUTPUT)
eo = np.zeros((filter_bank.shape[0], filter_bank.shape[1], filter_bank.shape[2], 2))
for i, filter in enumerate(filter_bank):eo[i] = cv2.idft(np.multiply(np.expand_dims(filter, -1), image_fft))for sc in range(n_scales):plt.figure(sc,figsize=(30,120))first = eo_magnitude[n_scales]first /= np.max(first)first *= 255shuiping = firstfor o in range(n_angles-1):out = eo_magnitude[sc * n_angles + o+1] - np.min(eo_magnitude[sc * n_angles + o+1])out /= np.max(out)out *= 255shuiping = np.hstack((shuiping,out))plt.imshow(shuiping,cmap="gray")

滤波后
在这里插入图片描述


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

相关文章

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

什么是Gabor滤波器&#xff1f; Gabor滤波器是一种由正弦波调制的高斯核线性滤波器。Gabor滤波器的频率和方向表示与人类视觉系统相似。Gabor滤波器组通常用于计算机视觉和图像处理。特别适用于边缘检测和纹理分类。一个二维Gabor滤波器是一个由正弦平面波调制的高斯核函数。好…

二维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界面操…