opencv实战项目十八:Gabor滤波器提取布料纹理

前言

在计算机视觉和图像处理领域,纹理分析一直是一个热门且富有挑战性的话题。纹理,作为图像中的一种重要视觉特征,不仅承载着丰富的视觉信息,而且在许多实际应用中扮演着关键角色,如物体识别、场景分类、图像检索等。为了有效地提取和描述图像中的纹理信息,研究者们提出了多种算法和工具,其中Gabor滤波器因其独特的优势而备受关注。
Gabor滤波器,一种基于正弦和余弦函数的线性滤波器,以其在空域和频域中同时具有局部化的特性而著称。它能够模拟人类视觉系统中的简单细胞感受野,因此在纹理分析和特征提取方面表现出色。本文将带您深入了解Gabor滤波器的工作原理,并探讨如何利用它来提取图像中的纹理特征。

一、Gabor简介

Gabor滤波器是一种强大的线性滤波器,它在图像处理和计算机视觉领域被广泛用于纹理分析和特征提取。它得名于物理学家Dennis Gabor,其设计灵感来源于人类视觉系统的感知特性。Gabor滤波器能够同时在空间域和频率域中实现局部化,这使得它在捕捉图像中的局部结构和纹理细节方面表现出色。
Gabor滤波器是一种复数滤波器,其基本形式是高斯函数与正弦或余弦函数的乘积。数学上,它可以表示为:
在这里插入图片描述

其中:
x 和 y 是图像中的空间坐标。
λ 是滤波器的波长,决定了滤波器的频率响应。
θ 是滤波器的方向,表示滤波器响应的方向。
ψ 是相位偏移,通常设置为0。
σ 是高斯函数的标准差,控制着滤波器的空间扩展。
γ 是空间纵横比,决定了滤波器椭圆形状的拉伸程度。

注:Gabor滤波器以其独特的局部性、方向性和多尺度性而著称,它能够在空间域和频率域中同时实现局部化,从而在图像中的特定位置提取特定频率的纹理信息;通过改变滤波器的方向参数θ,Gabor滤波器能够提取不同方向的纹理特征,增强了对图像纹理方向性的识别能力;此外,通过调整波长λ和标准差σ,Gabor滤波器能够在不同的尺度上分析纹理,从而全面地捕捉图像中的纹理细节。

二、cv2.getGaborKernel()

cv2.getGaborKernel 是OpenCV库中的一个函数,它用于生成Gabor滤波器的内核,以下是关于 cv2.getGaborKernel 函数的详细介绍:
kernel = cv2.getGaborKernel(ksize, sigma, theta, lambda, gamma, psi, ktype)
参数说明:

ksize:一个元组,表示滤波器内核的大小,格式为 (width, height)。通常,这个值是奇数,以确保有一个中心像素。
sigma:高斯函数的标准差,控制了Gabor函数的空间扩展。较大的值会导致滤波器在空间上更加扩展。
theta:Gabor滤波器的方向角度,表示滤波器响应的方向。它的单位是弧度,通常取值范围是 [0, pi)。
lambda:Gabor滤波器的波长,它决定了滤波器的频率响应。较小的值对应于较高的频率,可以捕捉更细小的纹理特征。
gamma:空间纵横比,决定了滤波器椭圆形状的拉伸程度。值越大,椭圆形状越扁。
psi:相位偏移,通常设置为0,但可以调整以改变滤波器的相位响应。
ktype:内核类型,通常设置为 cv2.CV_32F,表示内核数据类型为32位浮点数。

返回值:

返回一个Gabor滤波器的内核,它可以用于 cv2.filter2D 函数来对图像进行卷积操作。

使用案例:

import cv2
import numpy as np

# 创建一个Gabor滤波器
# 参数包括:ksize(滤波器大小),sigma(高斯的标准差),theta(滤波器方向),lambda(波长),gamma(空间纵横比),psi(相位偏移)
ksize = 11 # 滤波器大小
sigma = 1  # 高斯标准差

lambda_ = 3  # 波长
gamma = 0.5  # 空间纵横比
psi = 0     # 相位偏移

# 生成Gabor滤波器
kernel = cv2.getGaborKernel((ksize, ksize), sigma, np.pi/2 , lambda_, gamma, psi, ktype=cv2.CV_32F) #90 度 提取垂直方向纹理
kernel2 = cv2.getGaborKernel((ksize, ksize), sigma, 0, lambda_, gamma, psi, ktype=cv2.CV_32F) #0 度 提取水平方向纹理
# 读取图像
image = cv2.imread(r'F:\cv_traditional\img.png', cv2.IMREAD_GRAYSCALE)

# 确保图像和滤波器大小匹配
if image is not None:
    # 应用滤波器
    filtered_image = cv2.filter2D(image, cv2.CV_8UC3, kernel)
    filtered_image2 = cv2.filter2D(image, cv2.CV_8UC3, kernel2)
    # 显示原始图像和滤波后的图像
    cv2.imshow('Original Image', image)
    cv2.imshow('filtered_image', filtered_image)

    cv2.imshow('filtered_image2', filtered_image2)
    # 等待按键后退出
    cv2.waitKey(0)
    cv2.destroyAllWindows()
else:
    print("Error: Image not found.")

三,效果:

原图:
在这里插入图片描述

水平方向纹理:
在这里插入图片描述

垂直方向纹理:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值