OpenCV 例程200篇 总目录-202205更新
Gabor 变换是一种加窗短时傅里叶变换,以高斯函数作为短时傅里叶变换的窗函数,因此可以在频域不同尺度、不同方向上提取特征。
Gabor 函数对频率和方向表达与人类视觉响应非常类似,且对图像的亮度变化、对比度变化、姿态变化都具有较强鲁棒性。Gabor 滤波器常用于边缘提取,对纹理识别和分离的效果很好;可以用于表达图像局部特征, 在视觉领域中经常被用来作图像的预处理 。
在空间域将正弦函数与高斯函数进行卷积,就得到 Gabor 滤波器,其数学表达形式为:
g ( x , y ) = e x p [ − x ′ 2 + γ y ′ 2 2 σ 2 ] ⋅ e x p [ i ( 2 π x ′ λ + ψ ) ] g(x,y) = exp[- \frac{x'^2+\gamma y'^2}{2 \sigma ^2}] \cdot exp[i(2 \pi \frac{x'}{\lambda}+\psi)] g(x,y)=exp[−2σ2x′2+γy′2]⋅exp[i(2πλx′+ψ)]
实数部分:
g ( x , y ) = e x p [ − x ′ 2 + γ y ′ 2 2 σ 2 ] ⋅ c o s [ ( 2 π x ′ λ + ψ ) ] g(x,y) = exp[- \frac{x'^2+\gamma y'^2}{2 \sigma ^2}] \cdot cos[(2 \pi \frac{x'}{\lambda}+\psi)] g(x,y)=exp[−2σ2x′2+γy′2]⋅cos[(2πλx′+ψ)]
虚数部分:
g ( x , y ) = e x p [ − x ′ 2 + γ y ′ 2 2 σ 2 ] ⋅ s i n [ ( 2 π x ′ λ + ψ ) ] g(x,y) = exp[- \frac{x'^2+\gamma y'^2}{2 \sigma ^2}] \cdot sin[(2 \pi \frac{x'}{\lambda}+\psi)] g(x,y)=exp[−2σ2x′2+γy′2]⋅sin[(2πλx′+ψ)]
式中各参数的含义为:
x ′ = x c o s θ + y s i n θ y ′ = − x s i n θ + y c o s θ x' = x cos \theta + y sin \theta\\y' = - x sin \theta + y cos \theta\\ x′=xcosθ+ysinθy′=−xsinθ+ycosθ
λ \lambda λ,滤波器核函数中正弦函数的波长,像素数,大于2,小于图像尺寸的 1/5。
ψ \psi ψ,滤波器核函数中正弦函数的相位偏移,角度,-180~180度。0度时白条为中心,180度时黑条为中心。
θ \theta θ,滤波器核函数中平行条带的倾斜角度,0~360度。
γ \gamma γ,空间纵横比,核函数形状的椭圆率, γ = 1 \gamma=1 γ=1 时为圆形, γ < 1 \gamma<1 γ<1 时在条纹的平行方向伸长,通常取 0.5。
σ \sigma σ,滤波器核函数中高斯函数的标准差。
b b b,滤波器的半响应空间频率带宽,通常取 1.0,此时 σ / λ = 0.56 \sigma / \lambda = 0.56 σ/λ=0.56。带宽越小,标准差越大,平行条纹数量越多。
Gabor 滤波器的冲激响应是高斯函数与复指数函的乘积,达到时频测不准关系的下界,因此是兼顾信号在时频域的最优分辨率。
Gabor 滤波的基本思想是,不同纹理具有不同的中心频率及带宽,Gabor 滤波器是带通滤波器,只允许特定频率的纹理通过,因而可以分析和提取纹理特征。
Gabor 滤波器可以提取不同方向和不同尺度的特征,通常选择若干尺度和方向进行组,建立 Gabor 滤波器组。
OpenCV 中提供的 cv.getGaborKernel() 函数可以生成 Gabor 滤波器核。
函数说明:
cv.getGaborKernel(ksize, sigma, theta, lambd, gamma[, psi=CV_PI*0.5, ktype=CV_64F]) → retval
参数说明:
# 1.94: Gabor 滤波器组的形状
GaborKernel = []
size = [7, 9, 11, 13, 15, 17] # Gabor 滤波器尺寸
lamda = np.pi / 2.0 # 正弦函数波长
plt.figure(figsize=(10, 6))
for i in range(4):
theta = i * np.pi/4 # 平行条带倾斜角度,0°,45°,90°,135°
for k in range(6):
ksize = (size[k], size[k]) # Gabor 滤波器尺寸
kernel = cv2.getGaborKernel(ksize, 1.0, theta, lamda, 0.5, 0, ktype=cv2.CV_32F)
kernel /= kernel.sum()
plt.subplot(4, 6, i*6+k+1), plt.axis('off')
plt.imshow(kernel)
GaborKernel.append(kernel)
plt.tight_layout()
plt.show()
(本节完)
版权声明:
OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124970746)
Copyright 2022 youcans, XUPT
Crated:2022-5-25
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔
【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔
【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像
【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合
【youcans 的 OpenCV 例程200篇】189.基于掩模的拉普拉斯金字塔图像融合
【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合
【youcans 的 OpenCV 例程200篇】191.基于图像分割的金字塔图像融合
【youcans 的 OpenCV 例程200篇】192.Gabor 滤波器组的形状
【youcans 的 OpenCV 例程200篇】193.基于Gabor 滤波器的特征提取
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】