简介
HOG(Histogram of Oriented Gridients的简写)特征检测算法,最早是由法国研究员Dalal等在CVPR-2005上提出来的,一种解决人体目标检测的图像描述子,是一种用于表征图像局部梯度方向和梯度强度分布特性的描述符。
其主要思想是:在边缘具体位置未知的情况下,边缘方向的分布也可以很好的表示行人目标的外形轮廓。
Dalal等提出的HOG+SVM算法,在进行行人检测取得了极大地成功后,更多新算法不断涌现,不过大都是以HOG+SVM的思路为主线。
HOG算法
HOG特征检测算法可分为几个步骤:颜色空间归一化—>梯度计算—>梯度方向直方图—>重叠快直方图归一化—>HOG特征。下面分别对其进行介绍。
1、颜色空间归一化
由于图像的采集环境、装置等因素,采集到的人脸图像效果可能不是很好,容易出现误检或漏检的情况,所以需要对采集到的人脸进行图像预处理,主要是处理光线太暗或太强的情况,这里有两次处理:图像灰度化、Gamma校正。
①图像灰度化
对于彩色图像,将RGB分量转化成灰度图像,其转化公式为:
②Gamma校正
在图像照度不均匀的情况下,可以通过Gamma校正,将图像整体亮度提高或降低。在实际中可以采用两种不同的方式进行Gamma标准化,平方根、对数法。这里我们采用平方根的办法,公式如下(其中γ=0.5):
代码:
int main() { Mat picture = imread("test.jpg", 0);//灰度 Mat img; picture.convertTo(img, CV_32F); //转换成浮点 sqrt(img, img); //gamma校正 normalize(img, img, 0, 255, NORM_MINMAX, CV_8UC1);//归一化像素值[0,255] imshow("原图", picture); imshow("Gamma校正", img); waitKey(0); return 0; }
结果:
2、梯度计算
对经过颜色空间归一化后的图像,求取其梯度及梯度方向。分别在水平和垂直方向进行计算,梯度算子为:
代码:
/***************************************** Copyright (c) 2015 Jingshuang Hu @filename:intrins.cpp @datetime:2015.08.05 @author:HJS @e-mail:[email protected] @blog:http://blog.csdn.net/hujingshuang *****************************************/ #include <iostream> #include <cv.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include "histogram.h" using namespace cv; using namespace std; int main() { Mat picture = imread("test.jpg", 0);//灰度 Mat img; picture.convertTo(img, CV_32F); //转换成浮点 sqrt(img, img); //gamma校正 normalize(img, img, 0, 255, NORM_MINMAX, CV_32F);//归一化[0,255]浮点数 Mat gradient = Mat::zeros(img.rows, img.cols, CV_32F);//梯度 Mat theta = Mat::zeros(img.rows, img.cols, CV_32F);//角度 for (int i = 1; i < img.rows - 1; i++) { for (int j = 1; j < img.cols - 1; j++) { float Gx, Gy; Gx = img.at<float>(i, j + 1) - img.at<float>(i, j - 1); Gy = img.at<float>(i + 1, j) - img.at<float>(i - 1, j); gradient.at<float>(i, j) = sqrt(Gx * Gx + Gy * Gy);//梯度模值 theta.at<float>(i, j) = float(atan2(Gy, Gx) * 180 / CV_PI);//梯度方向[-180°,180°] } } normalize(gradient, gradient, 0, 255, NORM_MINMAX, CV_8UC1);//归一化[0,255] 无符号整型 normalize(img, img, 0, 255, NORM_MINMAX, CV_8UC1); imshow("原图", picture); imshow("Gamma校正", img); imshow("梯度图", gradient); waitKey(0); return 0; }
结果:
3、梯度方向直方图
参考资料:
1、维基百科:Histogram of oriented gradients
2、原论文:Histograms of Oriented Gradients for Human Detection
版权声明:本文为博主原创文章,未经博主允许不得转载。