基于OpenCV中心的直方图

时间:2016-11-22 08:11:10

标签: c++ opencv

我试图制作一个基于中心的直方图,这意味着中间的RGB图像的值更重要。我编写了下面的代码,但根据OpenCV自己的直方图函数它很慢。有没有办法让这个快?

void calc_histogram(cv::Mat& image, cv::Mat& histogram)
{
int bit = 8;
int max_value = pow(2, bit);

int n_blue_bin = 8;
int n_green_bin = 8;
int n_red_bin = 8;

int blue_width = max_value / n_blue_bin;
int green_width = max_value / n_green_bin;
int red_width = max_value / n_red_bin;

int mySizes[3]={n_blue_bin, n_green_bin, n_red_bin};
histogram = Mat::zeros(3,mySizes,CV_32F);

int blue, green, red;
int blue_bin, green_bin, red_bin;

float k, length;
float max_length = sqrt((image.rows/2)*(image.rows/2) + (image.cols/2)*(image.cols/2));

for(int i = 0 ; i < image.rows ; i++)
{
    for(int j = 0 ; j < image.cols ; j++)
    {
        length = sqrt(abs(image.rows/2 - i)*abs(image.rows/2 - i) + abs(image.cols/2 - j)*abs(image.cols/2 - j)) / max_length;
        k = sqrt(1-length);

        Vec3b intensity = image.at<Vec3b>(i, j);
        blue = intensity.val[0];
        green = intensity.val[1];
        red = intensity.val[2];

        blue_bin = blue / blue_width;
        green_bin = green / green_width;
        red_bin = red / red_width;
        histogram.at<float>(blue_bin, green_bin, red_bin) += k;
    }
}
}

1 个答案:

答案 0 :(得分:0)

作为直方图函数,这对我来说并不合适:你的结果真的应该是8x8x8矩阵吗?通常直方图是3xNumBins。要添加,请执行直方图[0] [红色] + = k;直方图[1] [绿色] + = K;直方图[2] [蓝色] + = K;通常k = 1,但在你的情况下,它是一个重量。也许我正在阅读opencv错误。

此外,你正在做很多多余的工作:为什么在平方之前绝对?当你可以乘以倒数时,不要分开。迭代y然后x。不要使用,而是使用指针。