定向梯度直方图

Posted

技术标签:

【中文标题】定向梯度直方图【英文标题】:Histogram of oriented gradiants 【发布时间】:2012-09-15 08:35:11 【问题描述】:

对于一个项目,我正在编写一些代码来计算某些图像的 HoG,但我坚持认为我的方向仅在 0 ~ 90 度之间,同时使用 atan2 函数。 我猜这个问题是由于 OpenCV 的 filter2D 功能造成的,但我不确定这是原因还是我做错了什么:

Vector<Vector<Mat_<float>>> HoG(Mat image) 
Mat img_x;
Mat img_y;
IplImage img = image;

Mat kern_x = (Mat_<char>(1, 3) << -1, 0, 1);
Mat kern_y = (Mat_<char>(3, 1) << -1, 0, 1);

filter2D(image, img_x, image.depth(), kern_x);
filter2D(image, img_y, image.depth(), kern_y);

Vector<Vector<Mat_<float>>> histograms;

for(int y = 0; y < image.rows - size; y += size) 
    Vector<Mat_<float>> temp_hist;
    for(int x = 0; x < image.cols - size; x += size) 
        float total_mag = 0;
        Mat hist = Mat::zeros(1, 8, CV_32FC1);
        for(int i = y; i < y + size; ++i) 
            for(int j = x; j < x + size; ++j) 
                float grad_x = (float)img_x.at<uchar>(i, j);
                float grad_y = (float)img_y.at<uchar>(i, j);
                double ori = myatan2(grad_x, grad_y);
                float mag = sqrt(pow(grad_x, 2) + pow(grad_y, 2));
                int bin = round(ori/45);
                hist.at<float>(0, (bin - 1 < 0 ? 7 : bin - 1)) += - (float)(ori - ((round(ori/45) - 1) * 45.0 + 22.5)) / 45.0f;
                hist.at<float>(0, bin) += -(float)(ori - ((round(ori/45) - 1) * 45.0 + 22.5)) / 45.0f;
                total_mag += mag;
            
        
        // Normalize the histogram
        for(int i = 0; i < 8; ++i) 
            hist.at<float>(0, i) = hist.at<float>(0, i) / total_mag;
        
        temp_hist.push_back(hist);
    
    histograms.push_back(temp_hist);


return histograms;

如果您有任何其他技巧可以提高我的代码的速度或其他内容,当然也欢迎。

【问题讨论】:

【参考方案1】:

我注意到了这一点:

float grad_x = (float)img_x.at<uchar>(i, j);
float grad_y = (float)img_y.at<uchar>(i, j);

您似乎在使用uchar。这不应该是char吗?

【讨论】:

使用 cv::sobel 可以更轻松地获取它和衍生产品

以上是关于定向梯度直方图的主要内容,如果未能解决你的问题,请参考以下文章

cell区域-方向梯度直方图

3直方图与二值化,图像梯度

HOG 梯度方向直方图简介(转载)

无论图像大小如何,都可以计算固定长度的梯度直方图(HOG)

3. OpenCV-Python——图像梯度算法边缘检测图像金字塔与轮廓检测直方图与傅里叶变换

3. OpenCV-Python——图像梯度算法边缘检测图像金字塔与轮廓检测直方图与傅里叶变换