1. LBP
LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。
1.1 LBP特征的描述
原始的LBP算子定义:在33的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。 这样,33邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。 LBP改进版本:
- 圆形LBP算子:
基本的 LBP算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala等对 LBP 算子进行了改进,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子; - LBP旋转不变模式
从 LBP 的定义可以看出,LBP 算子是灰度不变的,但却不是旋转不变的。图像的旋转就会得到不同的 LBP值。 Maenpaa等人又将 LBP算子进行了扩展,提出了具有旋转不变性的 LBP 算子,即不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值。 下图给出了求取旋转不变的 LBP 的过程示意图,图中算子下方的数字表示该算子对应的 LBP值,图中所示的 8 种 LBP模式,经过旋转不变的处理,最终得到的具有旋转不变性的 LBP值为 15。也就是说,图中的 8种 LBP 模式对应的旋转不变的 LBP模式都是 00001111。 - LBP等价模式
一个LBP算子可以产生不同的二进制模式,对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生P2种模式。很显然,随着邻域集内采样点数的增加,二进制模式的种类是急剧增加的。如此多的二值模式无论对于纹理的提取还是对于纹理的识别、分类及信息的存取都是不利的。同时,过多的模式种类对于纹理的表达是不利的。因此,需要对原始的LBP模式进行降维,使得数据量减少的情况下能最好的代表图像的信息。 为了解决二进制模式过多的问题,提高统计性,Ojala提出了采用一种“等价模式”(Uniform Pattern)来对LBP算子的模式种类进行降维。Ojala等认为,在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。因此,Ojala将“等价模式”定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。如00000000(0次跳变),00000111(只含一次从0到1的跳变),10001111(先由1跳到0,再由0跳到1,共两次跳变)都是等价模式类。除等价模式类以外的模式都归为另一类,称为混合模式类,例如10010111(共四次跳变)。 通过这样的改进,二进制模式的种类大大减少,而不会丢失任何信息。模式数量由原来的2P种减少为 P ( P-1)+2种,其中P表示邻域集内的采样点数。对于3×3邻域内8个采样点来说,二进制模式由原始的256种减少为58种,这使得特征向量的维数更少,并且可以减少高频噪声带来的影响。
1.2 对LBP特征向量进行提取的步骤
- 首先将检测窗口划分为16×16的小区域(cell)
- 对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值
- 然后计算每个cell的直方图,即每个数字(假定是十进制数LBP值)出现的频率;然后对该直方图进行归一化处理
- 最后将得到的每个cell的统计直方图进行连接成为一个特征向量,也就是整幅图的LBP纹理特征向量
- 然后便可利用SVM或者其他机器学习算法进行分类了
1.3 LBP在skimage的实现
from skimage.feature import local_binary_pattern
import matplotlib.pyplot as plt
import cv2
radius = 3
n_points = 8 * radius
image = cv2.imread('lena.jpg')
image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.subplot(131)
plt.imshow(image1)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
plt.subplot(132)
plt.imshow(image, cmap='gray')
lbp = local_binary_pattern(image, n_points, radius)
plt.subplot(133)
plt.imshow(lbp, cmap='gray')
plt.show()
2. Gabor
Gabor 特征是一种可以用来描述图像纹理信息的特征,Gabor 滤波器的频率和方向与人类的视觉系统类似,特别适合于纹理表示与判别。 Gabor 特征主要依靠 Gabor 核在频率域上对信号进行加窗,从而能描述信号的局部频率信息。 依靠傅里叶变换,我们才能将信号转换到频率域,才能让Gabor核在频率域去加窗。而在原本的空间域中,一个 Gabor 核实际上就是一个高斯核与正弦波调制的结果,可以看做是高斯核应用在了正弦波的频域部分。
2.1 图像的傅里叶变换
图像的傅里叶变换
2.2 Gabor变换
Gabor变换是D.Gabor 1946年提出的。为了由信号的Fourier变换提取局部信息,引入了时间局部化的窗函数,得到了窗口Fourier变换。由于窗口Fourier变换只依赖于部分时间的信号,所以,现在窗口Fourier变换又称为短时Fourier变换,这个变换又称为Gabor变换。
Gabor小波与人类视觉系统中简单细胞的视觉刺激响应非常相似。它在提取目标的局部空间和频率域信息方面具有良好的特性。 Gabor小波对于图像的边缘敏感,能够提供良好的方向选择和尺度选择特性,而且对于光照变化不敏感,能够提供对光照变化良好的适应性。上述特点使Gabor小波被广泛应用于视觉信息理解。
Gabor滤波器和脊椎动物视觉皮层感受野响应的比较:第一行代表脊椎动物的视觉皮层感受野,第二行是Gabor滤波器,第三行是两者的残差。可见两者相差极小。Gabor滤波器的这一性质,使得其在视觉领域中经常被用来作图像的预处理。
2.2.1 Gabor定义
Gabor变换的基本思想:把信号划分成许多小的时间间隔,用傅里叶变换分析每一个时间间隔,以便确定信号在该时间间隔存在的频率。其处理方法是对
f
(
t
)
f(t)
f(t)加一个滑动窗,再作傅里叶变换。
设函数
f
f
f为具体的函数,且
f
∈
L
2
(
R
)
f \in L^2(R)
f∈L2(R),则Gabor变换定义为:
G
f
(
a
;
b
,
w
)
=
∫
?
∞
∞
f
(
t
)
g
a
w
(
t
?
b
)
e
?
i
w
t
d
t
G_f(a;b,w) = \int_{-\infty}^{\infty} f(t) g^w_a (t-b) e^{-iwt} {\rm d}t
Gf?(a;b,w)=∫?∞∞?f(t)gaw?(t?b)e?iwtdt 其中
g
a
(
t
?
b
)
=
1
2
π
a
e
x
p
(
?
t
2
4
a
)
g_a(t-b) = \frac{1}{2 \sqrt{\pi a}} exp(- \frac{t^2}{4a})
ga?(t?b)=2πa
?1?exp(?4at2?),是高斯函数,称为窗函数,并且
a
>
0
,
b
>
0
a > 0,b > 0
a>0,b>0。
g
a
(
t
?
b
)
g_a(t-b)
ga?(t?b)是一个时间局部化的窗函数,其中,参数
b
b
b用于平行移动窗口,以便于覆盖整个时域。对参数b积分,则有:
∫
?
∞
∞
G
f
(
a
,
b
,
w
)
d
b
=
f
^
(
w
)
,
w
∈
R
\int_{-\infty}^{\infty} G_f(a,b,w) {\rm d}b = \widehat{f}(w), w \in R
∫?∞∞?Gf?(a,b,w)db=f
?(w),w∈R 信号的重构表达式为
f
(
t
)
=
1
2
π
∫
?
∞
∞
∫
?
∞
∞
G
f
(
a
,
b
,
w
)
g
a
(
t
?
b
)
e
i
w
t
d
w
d
b
f(t) = \frac{1}{2 \pi} \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} G_f(a, b, w) g_a(t-b) e^{iwt} {\rm d}w{ \rm d}b
f(t)=2π1?∫?∞∞?∫?∞∞?Gf?(a,b,w)ga?(t?b)eiwtdwdb Gabor取g(t)为一个高斯函数有两个原因:一是高斯函数的Fourier变换仍为高斯函数,这使得Fourier逆变换也是用窗函数局部化,同时体现了频域的局部化;二是Gabor变换是最优的窗口Fourier变换。其意义在于Gabor变换出现之后,才有了真正意义上的时间-频率分析。即Gabor变换可以达到时频局部化的目的:它能够在整体上提供信号的全部信息而又能提供在任一局部时间内信号变化剧烈程度的信息。简言之,可以同时提供时域和频域局部化的信息。
窗口的宽高关系: 经理论推导可以得出,高斯窗函数条件下的窗口宽度与高度,且积为一固定值。
[
b
?
a
,
b
+
a
]
×
[
w
?
1
a
a
,
w
?
1
a
a
]
=
(
2
△
G
b
,
w
a
)
(
2
△
H
b
,
w
a
)
=
(
2
△
g
a
)
(
2
△
g
1
4
,
a
)
=
2
[b - \sqrt{a}, b + \sqrt{a}] × [w - \frac{1}{a \sqrt{a}}, w - \frac{1}{a \sqrt{a}}] \\ = (2 \triangle G_{b,w}^a) (2 \triangle H_{b,w}^a) \\ = (2 \triangle g_a)(2 \triangle g_{\frac{1}{4},a}) \\ = 2
[b?a
?,b+a
?]×[w?aa
?1?,w?aa
?1?]=(2△Gb,wa?)(2△Hb,wa?)=(2△ga?)(2△g41?,a?)=2 可以看出Gabor变换的局限性:时间频率的宽度对所有频率是固定不变的。实际要求是:窗口的大小应随频率而变化,频率高窗口应愈小,这才符合实际问题中的高频信号的分辨率应比低频信号的分辨率要低。
2.2.2 离散Gabor变换的一般求法
-
首先选取核函数,可根据实际需要选取适当的核函数。如,如高斯窗函数;
g
(
t
)
=
(
2
T
)
2
e
?
π
(
t
T
)
2
g(t) = (\frac{\sqrt{2}}{T})^2 e^{- \pi (\frac{t}{T})^2 }
g(t)=(T2
??)2e?π(Tt?)2 则其对偶函数
γ
(
t
)
\gamma(t)
γ(t)为:
γ
(
t
)
=
(
1
2
T
)
1
2
(
K
0
π
)
?
3
2
e
π
(
t
T
)
2
∑
n
+
1
/
2
>
1
/
T
(
?
1
)
n
e
?
π
(
n
+
1
/
2
)
2
\gamma(t) = (\frac{1}{\sqrt{2}T})^{\frac{1}{2}} (\frac{K_0}{\pi})^{\frac{-3}{2}} e^{\pi (\frac{t}{T})^2} \sum_{n+1 / 2 > 1 / T} (-1)^n e^{- \pi (n+1 / 2 )^2 }
γ(t)=(2
?T1?)21?(πK0??)2?3?eπ(Tt?)2n+1/2>1/T∑?(?1)ne?π(n+1/2)2 -
离散Gabor变换的表达式
G
m
n
=
∫
?
∞
∞
?
(
t
)
g
?
(
t
?
m
T
)
e
?
j
n
w
t
d
t
=
∫
?
∞
∞
?
(
t
)
g
m
n
?
(
t
)
d
t
G_{mn} = \int_{-\infty}^{\infty} \phi(t) g^*(t-mT) e^{-jnwt} {\rm d}t \\ = \int_{-\infty}^{\infty} \phi(t) g^*_{mn}(t) {\rm d}t
Gmn?=∫?∞∞??(t)g?(t?mT)e?jnwtdt=∫?∞∞??(t)gmn??(t)dt
?
(
t
)
=
∑
m
?
∞
∞
∑
n
?
∞
∞
G
m
n
γ
(
t
?
m
T
)
e
j
n
w
t
=
∑
m
?
∞
∞
∑
n
?
∞
∞
G
m
n
γ
m
n
(
t
)
\phi(t) = \sum^{\infty}_{m-\infty} \sum^{\infty}_{n-\infty} G_{mn} \gamma(t-mT) e^{jnwt} \\ = \sum^{\infty}_{m-\infty} \sum^{\infty}_{n-\infty} G_{mn} \gamma_{mn}(t)
?(t)=m?∞∑∞?n?∞∑∞?Gmn?γ(t?mT)ejnwt=m?∞∑∞?n?∞∑∞?Gmn?γmn?(t)
其中:
g
m
n
(
t
)
=
g
(
t
?
m
T
)
e
j
n
w
t
g_{mn}(t) = g(t-mT) e^{jnwt}
gmn?(t)=g(t?mT)ejnwt
γ
(
t
)
\gamma(t)
γ(t)是
g
(
t
)
g(t)
g(t)的对偶函数,二者之间有如下双正交关系
∫
?
∞
∞
γ
(
t
)
g
?
(
t
?
m
T
)
e
?
j
n
w
t
d
t
=
g
m
g
n
\int_{-\infty}^{\infty} \gamma(t) g^*(t-mT) e^{-jnwt} {\rm d}t = g_m g_n
∫?∞∞?γ(t)g?(t?mT)e?jnwtdt=gm?gn?
2.2.2 Gabor变换实现
import cv2
import numpy as np
import pylab as pl
from PIL import Image
def build_filters():
filters = []
ksize = [7,9,11,13,15,17]
lamda = np.pi/2.0
for theta in np.arange(0,np.pi,np.pi/4):
for k in range(6):
kern = cv2.getGaborKernel((ksize[k],ksize[k]),1.0,theta,lamda,0.5,0,ktype=cv2.CV_32F)
kern /= 1.5*kern.sum()
filters.append(kern)
return filters
def process(img,filters):
accum = np.zeros_like(img)
for kern in filters:
fimg = cv2.filter2D(img,cv2.CV_8UC3,kern)
np.maximum(accum,fimg,accum)
return accum
def getGabor(img,filters):
image = Image.open(img)
img_ndarray = np.asarray(image)
res = []
for i in range(len(filters)):
res1 = process(img_ndarray,filters[i])
res.append(np.asarray(res1))
pl.figure(2)
for temp in range(len(res)):
pl.subplot(4,6,temp+1)
pl.imshow(res[temp],cmap='gray')
pl.show()
return res
if __name__ == '__main__':
filters = build_filters()
getGabor('lena.jpg',filters)
其它
SIFT/SURF、Harris、FAST、ORB、BRIEF见: opencv–图像特征提取与描述
参考资料
LBP特征 Gabor学习笔记
特征提取方法总结
Histogram:图像对比度是通过灰度级范围来度量的,而灰度级范围可通过观察灰度直方图得到,灰度级范围越大代表对比度越高;反之,对比度越低,低对比度的图像在视觉上给人的感觉是看起来不够清晰,所以通过算法调整图像的灰度值,从而调整图像的对比度是有必要的。 GLCM:灰度共生矩阵用于描述纹理特征。 Color:颜色空间转换 ShapeContext:形状上下文特征,基于物体轮廓样本点进行描述的,具体来说是基于计算形状相似性以及点与点之间的相关性来描述形状的。 SIFT:角点检测算法。 HOG:在一副图像中,梯度或边缘的方向密度分布能够很好地描述局部目标区域的特征,HPG正是利用这种思想,对梯度信息做出统计,并生成最后的特征描述。 LBP:常用于人脸识别 Gabor:一种可以用来描述图像纹理信息的特征。 SURF:角点检测算法。 Harris:角点检测算法。 FAST:角点检测算法。 BRIEF:角点检测算法。 ORB:角点检测算法。
|