码迷,mamicode.com
首页 > 编程语言 > 详细

HOG特征算法

时间:2015-08-07 14:43:50      阅读:618      评论:0      收藏:0      [点我收藏+]

标签:hog特征   行人检测   hog+svm   

简介

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:eleftheria@163.com
@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

版权声明:本文为博主原创文章,未经博主允许不得转载。

HOG特征算法

标签:hog特征   行人检测   hog+svm   

原文地址:http://blog.csdn.net/hujingshuang/article/details/47337707

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!