引言

笔者在研究红外图像与可见光图像配准时接触到了很多描述符,其中关于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. 如何有效编写软件的75条建议
  2. 树状dp(这个人写得好多转来慢慢看)
  3. 全国高校大学生竞赛质量提升工作推进会
  4. linux怎么测试磁盘读写,怎样测试Linux磁盘的读写速率
  5. 从python存入的文件是乱码_如何解决python写入html文件中乱码的现象(图文详解)...
  6. C语言高级编程:char、signed char 和 unsigned char的使用区别
  7. CVE漏洞—PHPCMS2008 /type.php代码注入高危漏洞预警
  8. 如何写出让人抓狂的代码?
  9. dubbo的Extension源码分析
  10. mysql 主命令总结
  11. Spring之事务控制
  12. 三菱PLC(FX5U)与C#通信说明
  13. idea创建j2ee_IntelliJ IDEA 2018 Community(社区版)创建J2EE项目+Tomcat9部署
  14. 限制编辑的PDF文档没有密码如何破解?
  15. android导入excel文件格式,android 把数据导入到excel文件中的三种方法
  16. elementUI中table的表头设置提示tooltips
  17. 文字记录而已!!人民币直充/兑换PayPal美金
  18. CDN加速是什么?具体有什么用?
  19. Eason's concert
  20. 大规模SNS中兴趣圈子的自动挖掘

热门文章

  1. Pandas第三部分Day5练习题
  2. Java编程题笔试常用API
  3. 一起做激光反光板(一)-EKF定位公式推导
  4. java计算机毕业设计校园疫情防控管理软件源码+数据库+系统+lw文档+部署
  5. 「津津乐道播客」#254. 津津有味:对不起,我不想再跟你吃饭了
  6. 高中电子技术——蜂鸣器引脚上串联的耦合电容
  7. kali与Windows10双系统
  8. QQ登录错误码:100044的解决办法
  9. 15种顶级分析思维模型,真的顶!
  10. java 红包接口_微信支付中微信红包的接口测试,Java版本