OpenCV与图像处理学习十二——图像形状特征之HOG特征
- 一、图像特征理解
- 1.1 颜色特征
- 1.2 纹理特征
- 1.3 形状特征
- 1.4 空间关系特征
- 二、形状特征描述
- 2.1 HOG特征
- 2.1.1 基本概念
- 2.1.2 HOG实现过程
- 2.1.3 代码实现
前面介绍了图像的基础知识、基本处理方法以及传统图像分割的应用,下面的笔记将介绍图像特征与目标检测部分的应用,知识脉络如下所示:
一、图像特征理解
图像特征是图像中独特的, 易于跟踪和比较的特定模板或特定结构,如下图所示:
其中E和F是在图像中独特的、特殊的模板,而ABCD四个在图像中是普遍存在的,没有特殊性。
特征就是有意义的图像区域, 该区域具有独特性或易于识别性!
图像特征提取与匹配是计算机视觉中的一个关键问题, 在目标检测、物体识别、 三维重建、 图像配准、 图像理解等具体应用中发挥着重要作用。
图像特征主要有图像的颜色特征、 纹理特征、 形状特征和空间关系特征。
1.1 颜色特征
颜色特征是一种全局特征, 描述了图像或图像区域所对应的景物的表面性质。
颜色特征描述方法:
- 颜色直方图
- 颜色空间
- 颜色分布
1.2 纹理特征
纹理特征也是一种全局特征, 它也描述了图像或图像区域所对应景物的表面性质。 但由于纹理只是一种物体表面的特性, 并不能完全反映出物体的本质属性,所以仅仅利用纹理特征是无法获得高层次图像内容的。
1.3 形状特征
形状特征有两类表示方法,一类是轮廓特征, 另一类是区域特征。图像的轮廓特征主要针对物体的外边界,而图像的区域特征则描述了是图像中的局部形状特征。
1.4 空间关系特征
是指图像中分割出来的多个目标之间的相互的空间位置或相对方向关系。
这些关系也可分为连接/邻接关系、 交叠/重叠关系和包含/独立关系等。
二、形状特征描述
2.1 HOG特征
2.1.1 基本概念
方向梯度直方图(Histogram of Oriented Gradient, HOG) 特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。
它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像识别中, 尤其在行人检测中获得了极大的成功。
主要思想: 在一副图像中, 目标的形状能够被梯度或边缘的方向密度分布很好地描述,所以使用HOG特征来描述目标的形状。
2.1.2 HOG实现过程
- 灰度化(将图像看做一个x,y,z(灰度) 的三维图像);
- 采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);
- 计算图像每个像素的梯度(包括大小和方向);
- 将图像划分成小cells;
- 统计每个cell的梯度直方图(不同梯度的个数),得到cell的描述子;
- 将每几个cell组成一个block, 得到block的描述子;
- 将图像image内的所有block的HOG特征descriptor串联起来就可以得到HOG特征, 该特征向量就是用来目标检测或分类的特征。
2.1.3 代码实现
import cv2
import numpy as np
# 判断矩形i是否完全包含在矩形o中
def is_inside(o, i):ox, oy, ow, oh = oix, iy, iw, ih = ireturn ox > ix and oy > iy and ox + ow < ix + iw and oy + oh < iy + ih# 对人体绘制颜色框
def draw_person(image, person):x, y, w, h = personcv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 255), 2)img = cv2.imread("people.jpg")
hog = cv2.HOGDescriptor() # 启动检测器对象
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) # 指定检测器类型为人体
found, w = hog.detectMultiScale(img, 0.1, (1, 1)) # 加载并检测图像
print(found)
print(w)# 丢弃某些完全被其它矩形包含在内的矩形
found_filtered = []
for ri, r in enumerate(found):for qi, q in enumerate(found):if ri != qi and is_inside(r, q):breakelse:found_filtered.append(r)print(found_filtered)
# 对不包含在内的有效矩形进行颜色框定
for person in found_filtered:draw_person(img, person)
cv2.imshow("people detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图为:
检测结果: