文章目录
前言
本文为8月19日计算机视觉理论学习笔记——图像特征与描述,分为两个章节:
- 颜色特征;
- 几何特征。
一、颜色特征
1、量化颜色直方图
- 优势: 计算高效;
- 劣势:
- 量化问题;
- 稀疏。
2、聚类颜色直方图
- 适用颜色空间: Lab等。
- 操作:
- 使用聚类算法对所有像素点的颜色向量进行聚类;
- 单元(bin)由聚类中心代表。
- Lab空间:
- L 表示像素的亮度,取值范围:[0, 100],从纯黑到纯白;
- a 表示从品红色到深绿色,取值范围:[127, -128];
- b 表示从黄色到蓝色,取值范围:[127, -128]。
二、几何特征
1、边缘(Edge)
像素明显变化的区域,用于:
- 物体识别;
- 几何、视角变换。
像素值函数快速变化的区域 ⇒ 一阶导数极值区域。
- 边缘提取: 先高斯去噪,再使用一阶导数获取极值。
h
σ
(
u
,
v
)
=
1
2
π
σ
2
e
−
u
2
+
v
2
2
σ
2
∂
∂
x
h
σ
(
u
,
v
)
⇒
h
x
(
x
,
y
)
=
∂
h
(
x
,
y
)
∂
x
=
−
x
2
π
σ
4
e
−
x
2
+
y
2
2
σ
2
⇒
h
y
(
x
,
y
)
=
∂
h
(
x
,
y
)
∂
y
=
−
y
2
π
σ
4
e
−
x
2
+
y
2
2
σ
2
h_{\sigma}(u,v) = \frac{1}{2\pi \sigma^2} e^{-\frac{u^2+v^2}{2\sigma^2}}\\\ \frac{\partial}{\partial x} h_{\sigma} (u, v)\\\ ⇒ h_x(x, y) = \frac{\partial h(x, y)}{\partial x} = \frac{-x}{2\pi \sigma^4}e^{-\frac{x^2 + y^2}{2\sigma^2} }\\\ ⇒ h_y(x, y) = \frac{\partial h(x, y)}{\partial y} = \frac{-y}{2\pi \sigma^4}e^{-\frac{x^2 + y^2}{2\sigma^2} }
hσ(u,v)=2πσ21e−2σ2u2+v2 ∂x∂hσ(u,v) ⇒hx(x,y)=∂x∂h(x,y)=2πσ4−xe−2σ2x2+y2 ⇒hy(x,y)=∂y∂h(x,y)=2πσ4−ye−2σ2x2+y2
- 梯度幅值/强度:
- 水平方向: ▽ f = [ ∂ f ∂ x , 0 ] \bigtriangledown f = [\frac{\partial f}{\partial x}, 0 ] ▽f=[∂x∂f,0].
- 垂直方向: ▽ f = [ 0 , ∂ f ∂ y ] \bigtriangledown f = [0, \frac{\partial f}{\partial y} ] ▽f=[0,∂y∂f].
- 有角度: ▽ f = [ ∂ f ∂ x , ∂ f ∂ y ] \bigtriangledown f = [\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} ] ▽f=[∂x∂f,∂y∂f]
- 梯度变化最快的方向: a r c t a n ( h y ( x , y ) h x ( x , y ) ) arctan(\frac{h_y(x, y)}{h_x(x, y)} ) arctan(hx(x,y)hy(x,y)).
2、关键点
稳定局部特征点:
- 可重复性、显著性;
- 抗图片变换:
- 外貌变换(亮度、光照);
- 几何变换(平移、选择、尺度)。
(1)、Harris 角点
在任何方向上移动小观察窗,导致大的像素变动。
- 数学模型: 偏移(u, v)后窗内图像的变化:
E
(
u
,
v
)
=
∑
x
,
y
w
(
x
,
y
)
[
I
(
x
+
u
,
y
+
v
)
−
I
(
x
,
y
)
]
E(u, v) = \sum_{x, y} w(x, y)[I(x+u,\ y+v) - I(x, y)]
E(u,v)=x,y∑w(x,y)[I(x+u, y+v)−I(x,y)]
其中,
w
(
x
,
y
)
w(x, y)
w(x,y) 为窗口函数,
I
(
x
+
u
,
y
+
v
)
I(x+u,\ y+v)
I(x+u, y+v) 位移后的强度,
I
(
x
,
y
)
I(x, y)
I(x,y) 为像素强度。
- 如何判断:
- 直线:一个特征值大,另一个特征值小;
- 平面:两个特征值都小,且近似相等;
- 角点:两个特征值都大,且近似相等。
代码如下:
filename = r'./chessboard.png'
img = cv.imread(filename)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv.cornerHarris(gray, 2, 3, 0.04)
dst = cv.dilate(dst, None)
# Threshold for an optimal value, it may vary depending on the image
img[dst>0.01*dst.max()] = [0, 0, 255]
cv.imshow('dst', img)
if cv.waitKey(0) & 0xff == 27:
cv.destroyAllWindows()
(2)、FAST 角点
一种快速角点特征检测算法。
- 检测:
- 确定一个阈值t,观察以某像素点为中心的一个半径为3像素的园(16个像素);
- 若在这个圆上有n(12)个连续的像素点,它们的像素值要么都比 I p + t I_p + t Ip+t 大,要么都比 I p − t I_p - t Ip−t 小,则 p p p 就是一个角点。
3、斑点(Blob)
一阶导极值点 ⇒ 二阶导零点。
首先对图像进行高斯卷积滤波降噪,再采用 Laplace 算子进行边缘检测。
- 高斯拉普拉斯滤波/Laplacian of Gaussian(LoG):
G ( x , y , σ ) = 1 2 π σ 2 e − u 2 + v 2 2 σ 2 ▽ 2 G = − 2 σ 2 + x 2 + y 2 2 π σ 6 e − x 2 + y 2 2 σ 2 G(x, y, \sigma) = \frac{1}{2\pi \sigma^2} e^{-\frac{u^2+v^2}{2\sigma^2}}\\\ \bigtriangledown^2G = \frac{-2\sigma ^2+x^2+y^2}{2\pi \sigma^6} e^{-\frac{x^2+y^2}{2\sigma ^2} } G(x,y,σ)=2πσ21e−2σ2u2+v2 ▽2G=2πσ6−2σ2+x2+y2e−2σ2x2+y2
当 σ \sigma σ 较小时,可识别出更细节的边缘。
LoG 图找到极值点 ==> 斑点。
拉普拉斯算子锐化:
# 读入原图像
img = Image.open(r'./butterfly.jpg')
img.show()
# 转为灰度图,以减少计算的维度
img_gray = img.convert('L')
img_gray.show()
# 得到像素矩阵
img_arr = np.array(img_gray)
h = img_arr.shape[0] # 行
w = img_arr.shape[1] # 列
# 拉普拉斯算子锐化图像,用二阶微分
new_img_arr = np.zeros((h, w))
for i in range(2, h-1):
for j in range(2, w-1):
new_img_arr[i][j] = img_arr[i+1, j] + img_arr[i-1, j] + \
img_arr[i, j+1] + img_arr[i, j-1] - \
4*img_arr[i, j]
# 锐化后的图像与原图像相加
laplacian_img_arr = np.zeros((h, w))
for i in range(2, h-1):
for j in range(2, w-1):
laplacian_img_arr[i][j] = new_img_arr[i][j] + img_arr[i][j]
img_laplacian = Image.fromarray(np.uint8(new_img_arr))
img_laplacian.show()
img_laplacian2 = Image.fromarray(np.uint8(laplacian_img_arr))
img_laplacian2.show()
4、局部特征 SIFT
基于尺度空间不变的特征,有以下特点:
- 不变性;
- 独特性;
- 多量性;
- 计算快。
尺度空间:
- 使用不同的 σ \sigma σ 的LOG对图片进行滤波;
- 使用 DOG 代替 LOG,用差分代替微分:
▽ 2 G = − 2 σ 2 + x 2 + y 2 2 π σ 6 e − x 2 + y 2 2 σ 2 ⇒ ▽ 2 G = G ( x , y , k σ ) − G ( x , y , σ ) k σ − σ \bigtriangledown^2G = \frac{-2\sigma ^2+x^2+y^2}{2\pi \sigma^6} e^{-\frac{x^2+y^2}{2\sigma ^2} } ⇒ \\\ \bigtriangledown^2G = \frac{G(x, y, k\sigma ) - G(x ,y, \sigma )}{k\sigma -\sigma } ▽2G=2πσ6−2σ2+x2+y2e−2σ2x2+y2⇒ ▽2G=kσ−σG(x,y,kσ)−G(x,y,σ)
计算高斯差分(DoG)空间:
特征点方向估计:
- 在尺度上计算梯度直方图;
- 获取最高值方向为关键点主方向;
- 辅方向:超过最高值80%的方向。
代码如下:
img = cv.imread(r'./home.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
sift = cv.SIFT_create()
kp = sift.detect(gray, None)
img = cv.drawKeypoints(gray, kp, img)
cv.imshow('SIFT', img)
cv.imwrite('sift_keypoints.jpg', img)
cv.waitKey(0)
cv.destroyAllWindows()
5、局部特征 SURF
对 SIFT 的改进,速度提高3倍,在亮度变化下效果好,模糊方面优于 SIFT,但尺度不变上不及 SIFT,旋转不变上差很多。
- 步骤:
- 统计特征点领域内的 Haar 小波特征;
- 以特征点为中心,计算半径为6s的邻域内,统计60度扇形内所有在x和y方向的 Haar 小波响应总和;
- 60度扇形以一定间隔进行旋转,将最大值那个扇形的方向作为该特征点的主方向。
代码如下:
img = cv.imread(r'./butterfly.jpg', 0)
surf = cv.SURF_create(400)
surf = setHessianThreshold(50000)
kp, des = surf.detectAndCompute(img, None)
img2 = cv.drawKeypoints(img, kp, None, (255, 0, 0), 4)
cv.imshow('surf', img2)
cv.waitKey(0)
cv.destroyAllWindows()
6、ORB 特征描述
基于 FAST 角点的特征点检测与 BRIEF 特征描述技术。
代码如下:
img1 = cv.imread(r'./box.png', 0) # queryImage
img2 = cv.imread(r'./box_in_scene.png', 0) # trainImage
# 初始化 ORB detecter
orb = cv.ORB_create()
# 找到 keypoints and descriptors
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
# create BFMatcher object
bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
# Match descriptions
matches = bf.match(des1, des2)
# 根据距离排序
matches = sorted(matches, key=lambda x: x.distance)
# Draw first 10 matches
img3 = cv.drawMatches(img1, kp1, img2, kp2, matches[:20], None, flags=2)
plt.imshow(img3), plt.show()
7、LBP 局部二值模式
将每个像素点与周围点大小比较:
- 半径为 R 的圆上,均匀采样 P 个点;
- 大小量化为 0 或 1.
多个 bit 组成一个数,统计每个数的直方图。