引言

笔者在研究红外图像与可见光图像配准时接触到了很多描述符,其中关于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(ω)=e−log(ω/ω0​)2/(2(log(k/ω0​)2))
Log-Gabor函数并不能在空间域中得到表达式,滤波器的构造须在频域中。对图像来说,在空域的卷积等价于在频域的乘积,所以我们直接创建与图像大小相同的Log-Gabor滤波器,在频域中完成图像处理,之后再回到空域中进行统计。一个二维的Log-Gabor滤波器可以分解为径向滤波器和角度滤波器两部分,对应极坐标公式为:

完整的Log-Gabor滤波器由这两部分相乘得到:

其中r是经向坐标,θ\thetaθ为角度坐标,f0,θ0f_0,\theta_0f0​,θ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")

滤波后

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

  1. OpenCV 4.5.1 - 新版本 中 BEBLID 描述符尝鲜 (基于 ubuntu / c++)

    时间:20210222 目录 文章目录 1. OpenCV 4.5.1 发布 1.1 参考资料 1.2 新特性 BEBLID 描述符 2. OpenCV 4.5.1 编译 (Ubuntu 18.04) ...

  2. opencv(十八)-关键点和描述符

    索引目录 1.关键点的类cv::KeyPoint 2.cv::Feature2D-查找并计算描述符 3.cv::DMatch对象 4.cv::DescriptorMatcher 关键点匹配类 5.核心 ...

  3. 【Python+OpenCV】主流特征点检测器和描述子总结与实现附拼接结果(SIFT,SURF,ORB,AKAZE,FAST,BRIEF,CenSurE,BEBLID,SuperPoint)

    文章目录 准备工作 SIFT SURF ORB AKAZE FAST与BRIEF CenSurE BEBLID 匹配点后的图像拼接 SuperPoint 总结 准备工作 先准备两张待处理的图像,要求有 ...

  4. python opencv pdf脚本之家_OpenCV 3和Qt5计算机视觉应用开发 PDF 影印含源码版

    给大家带来的一篇关于计算机视觉相关的电子书资源,介绍了关于OpenCV3.Qt5.计算机视觉.应用开发方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小117.2 MB,阿敏·艾哈迈迪·泰 ...

  5. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过 ...

  6. python如何计算分子描述符_Python——描述符(descriptor)解密

    本文由 极客范 - 慕容老匹夫 翻译自 Chris Beaumont.欢迎加入极客翻译小组,同我们一道翻译与分享.转载请参见文章末尾处的要求. Python中包含了许多内建的语言特性,它们使得代码简洁 ...

  7. python中文件描述符_Python中的描述符

    python中文件描述符 In Python, a class that implements a get, set or delete methods for an object is called ...

  8. python 描述符参考文档_python 描述符详解

    Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...

  9. python描述符详解

    什么是描述符 数据描述符data descriptor和非数据描述符non-data descriptors 如何检测一个对象是不是描述符 描述符有什么用和好处 例子 总结 本文主要介绍描述符的定义, ...

最新文章

  1. 《jQuery与JavaScript入门经典》——第 1 章 动态Web编程简介 1.1理解Web服务器浏览器范式...
  2. maxcompute 2.0复杂数据类型之struct
  3. java接收的文件转换成临时文件_Android中怎样使用createTempFile实现将字节数据创建到临时文件并转换成FileOutputStream和FileInputStream...
  4. spring boot中servlet启动原理
  5. 【技术解决方案】GitHub本地仓库管理与远程仓库管理
  6. 1618D. Array and Operations
  7. 使用JAVA如何对图片进行格式检查以及安全检查处理
  8. Maven安装与配置教程
  9. OLDX-FC开源飞控
  10. C++学习记录vs2013 植物大战僵尸mfc辅助大体框架编写
  11. 如何处理phpmyadmin中访问被拒绝
  12. 使用Persimmon UI Builder 开发的一些技巧和注意事项 -- (RT-thread 柿饼UI)
  13. navicat导出数据库数据
  14. V3S-Zero TF卡无法引导Linux启动问题
  15. 【C语言常识】Keil MDK的分散加载文件.sct
  16. 1*1卷积核的作用(bottleneck的作用)
  17. 抖音禁封规则讲解(8)涉嫌黑社会,走私物品被禁封丨国仁网络
  18. 黑帽技术与白帽技术的区别
  19. 解决Oracle Temp01.dbf文件过大
  20. 我的大学四年——郭天祥

热门文章

  1. AD20和立创EDA设计(5)立创EDA导出3D模型放入AD20使用
  2. 常见邮箱开启 SMTP 服务及 Python 发送 email 详细说明
  3. 基于BP神经网络预测日本麻将立直听牌
  4. 微博客传播特性及盈利模式分析
  5. 不规则图形数格子的方法_方格图中不规则图形的面积计算
  6. 学计算机怎么作宣传手册,用PowerPoint制作宣传册
  7. 用html语言制作个人网页,使用HTML制作个人网页.ppt
  8. Flash MX 2004 编程(AS2.0)教程(十一)
  9. match_phrase短语匹配和近似匹配
  10. JS工具库之Lodash用法005 _.difference(),_.differenceBy()_.differenceWith()