1.前言
在深度学习出来之前,图像识别领域北有“Gabor帮主”,南有“SIFT慕容小哥”。目前,深度学习技术可以利用CNN网络和大数据样本搞事情,从而取替“Gabor帮主”和“SIFT慕容小哥”的江湖地位。但,在没有大数据和算力支撑的“乡村小镇”地带,或是对付“刁民小辈”,“Gabor帮主”可以大显身手,具有不可撼动的地位。IT武林中,有基于C++和OpenCV,或是基于matlab的Gabor图像变换与特征提取源代码,但大多招数花哨。而基于Python语言的Gabor图像变换和特征提取却很少见。本博主在实现基于Python语言的Gabor图像变换和特征提取中发现其确实比OpenCV或matlab务实,话少人狠,特和大家分享。
2. “Gabor帮主”简介
“Gabor帮主”最厉害的武器是Gabor滤波器,其最主要使用优势体现在对物体纹理特征的提取上。Gabor滤波器对于图像的亮度和对比度变化以及图像姿态变化具有较强的鲁棒性,并且它表达的是对图像识别最为有用的局部特征,故在计算机视觉及纹理分析领域中得到广泛的应用。Gabor滤波器可以提取不同方向和不同尺度的上的特征,并且进行随意组合,变幻莫测。下图为4个方向(0o,45o,90o,135o)和6个尺度(7,9,11,13,15,17),组合生成的24个Gabor滤波核。
3.“Gabor帮主”大招之图像变换
所谓Gabor图像变换就使用Gabor滤波器对图像进行滤波操作(相当于CNN中的卷积操作)得到新的图像。每个滤波核与图像滤波之后得到:
其中,λ为波,它的值以像素为单位指定,通常大于等于2。但不能大于输入图像尺寸的五分之一;
θ为方向,指定了Gabor函数并行条纹的方向,它的取值为0到2π;
"text-align: center">
x',y'的值为:
gabor滤波核是复数形式,因此可以把它分开成实部和虚部:
弄清以上公式原理后,大家也可以自己尝试利用Python把Gabor变换实现,源代码我这里就不贴了,如果大家感兴趣,可以参考https://www.jb51.net/article/198212.htm。其实,skimage包中就有封装好的gabor变换函数,可以直接调用。因此,这里介绍一种简单偷懒的方式。从skimage中导入filters(from skimage import filters)后,便可调用gabor函数了,其函数说明如下:
skimage.filters.gabor(image, frequency, theta=0, bandwidth=1, sigma_x=None, sigma_y=None, n_stds=3, offset=0, mode=‘reflect', cval=0)
1)函数返回:
Gabor变换后的实部和虚部real,imag;大小与输入图像尺寸相同。
2)函数参数:
图像(image):二维数组输入图像(灰度图像);
频率(frequency):浮点谐波函数的空间频率,控制尺度;
,在图像特征提取领域通常取5个不同尺度
方向(theta):float,可选的弧度方向,如果为0,则谐波处于x方向;
,在图像特征提取领域通常取8个不同方向u=[0,1,2,3,4,5,6,7]。
带宽(bandwidth):浮点,可选由过滤器捕获的带宽。对于固定带宽,sigma_x和sigma_y将随着频率的增加而降低,如果用户设置了sigma_x和sigma_y,则该值将被忽略;标准偏差(sigma_x,sigma_y):float,x和y方向上的可选标准偏差;
内核的线性大小(n_stds):标量,可选内核的线性大小为n_stds(默认为3)标准偏差;偏移量(offset):浮点数,可选项以弧度表示的谐波函数的相位偏移;模式(mode):{‘constant',‘near',‘reflect',‘mirror',‘wrap'},可选用于将图像与内核进行卷积的模式,传递给ndi.convolve;cval:标量,可选值如果卷积模式为'不变',该参数被传递给ndi.convolve。
3)源代码如下:
import matplotlib.pyplot as plt from skimage import filters,io,color import numpy as np filename='D:/lena.jpg' img = io.imread(filename)#读取图像 img_gray = color.rgb2gray(img)#RGB转灰度 frequency=0.6 #调用gabor函数 real, imag = filters.gabor(img_gray, frequency=0.6,theta=45,n_stds=5) #取模图像 img_mod=np.sqrt(real.astype(float)**2+imag.astype(float)**2) #图像显示 plt.figure() plt.subplot(2,2,1) plt.imshow(img_gray,cmap='gray') plt.subplot(2,2,2) plt.imshow(img_mod,cmap='gray') plt.subplot(2,2,3) plt.imshow(real,cmap='gray') plt.subplot(2,2,4) plt.imshow(imag,cmap='gray') plt.show()
4)运行结果如下:
5)注意事项
①通过theta参数调不同方向,这里输入是弧度,不是角度。②通过frequency参数调不同尺度变化。
6)利用skimage生成gobor卷积核:gabor_kernel
skimage.filters.gabor_kernel(frequency, theta=0, bandwidth=1, sigma_x=None, sigma_y=None, n_stds=3, offset=0)
函数返回:返回2D Gabor滤波器内核,包含实部与虚部。
参数与skimage.filters.gabor()函数相同。
源代码如下:
import matplotlib.pyplot as plt from skimage import filters gk = filters.gabor_kernel(frequency=0.1,theta=np.pi*30/180.0,n_stds=5) mod=np.sqrt(gk.real.astype(float) ** 2 + gk.imag.astype(float) ** 2) plt.figure() plt.subplot(1,3,1) plt.imshow(gk.real*255,cmap='gray') plt.subplot(1,3,2) plt.imshow(gk.imag*255,cmap='gray') plt.subplot(1,3,3) plt.imshow(mod*255,cmap='gray') plt.show()
运行结果如下:
注意事项:①参数n_stds=3并不是说滤波核大小为(3,3),滤波核大小由参数frequency、theta、n_stds三个参数共同决定。②gabor_kernel函数返回是带有实部和虚部的复矩阵。③theta是弧度,不是角度
3.“Gabor帮主”大招之图像特征提取
Gabor滤波器可以在频域上不同尺度、不同方向上提取相关的特征。另外,Gabor函数与人眼的作用相仿,所以经常用作纹理识别上,并取得了较好的效果。Gabor特征提取一般包括取模、特征降维、特征归一化和特征选取等操作:
取模:skimage.filters.gabor()函数返回的是图像变换后的实部和虚部,在图像识别领域一般使用其模作为图像特征
2)特征降维:skimage.filters.gabor()函数返回值大小和原图像一样;另外,图像识别领域一般使用8个方向和5个尺度的gabor滤波器,得到40幅变换图像;导致提取的图像特征维度(40幅图像特征串联)比较高。因此,需要对取模图像进行降维处理。最简单的方法就是对每个模图像进行下采样,如使用Opencv中的resize函数cv2.resize(img,(0,0),fx=1/4,fy=1/4)。
3)特征归一化:
在机器学习领域中,不同评价指标(即特征向量中的不同特征就是所述的不同评价指标)往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。其中,最典型的就是数据的归一化处理。简而言之,归一化的目的就是使得预处理的数据被限定在一定的范围内。本博主介绍一种Z-score标准化方法:
当一化公式:
其中μ为所有样本数据的均值,σ为所有样本数据的标准差。
b)本方法要求原始数据的分布可以近似为高斯分布,否则归一化的效果会变得很糟糕;
c)应用场景:在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,Z-score standardization表现更好。
4)特征选取
经过以上三步后,可以将各模图像特征串联起来作为输入图像的特征向量。但此时得到的特征向量存在大量冗余,最好再进行一次特征降维(特征选取)操作。可以采用PCA或Fisher等线性子空间分析方法。
5)源代码:
import cv2 import numpy as np from skimage import filters filename='D:/lena.jpg' img = cv2.imread(filename)#读图像 img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转灰度 frequency=0.6 #gabor变换 real, imag = filters.gabor(img_gray, frequency=0.6,theta=45,n_stds=5) #取模 img_mod=np.sqrt(real.astype(float)**2+imag.astype(float)**2) #图像缩放(下采样) newimg = cv2.resize(img_mod,(0,0),fx=1/4,fy=1/4,interpolation=cv2.INTER_AREA) tempfea = newimg.flatten()#矩阵展平 tmean = np.mean(tempfea)#求均值 tstd = np.std(tempfea)#求方差 newfea = (tempfea - tmean)/tstd#数值归一化 print(newfea)
夜已深,公司都没有一个人了,空荡荡的。先写到这里吧,第一次在CSDN上发博文,有不到之处请指正,如果您觉得还有点用,请点个赞以支鼓励,不胜感激!!!!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]