c++ - 基于 OpenCV 中心的直方图

标签 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;
    }
}
}

最佳答案

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

你还做了很多多余的工作:为什么在平方之前要腹肌?当你可以乘以倒数时,永远不要除法。迭代 y 然后 x。不要使用 at,而是获取一个指针。

关于c++ - 基于 OpenCV 中心的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40736722/

相关文章:

python - 确定时空图像的图案方向

c++ - 将 std 字符串转换为 nsstring

c++ - 在 opencv2 和 opencv3 中使用 findContours 时的输出差异

image - 尝试使用opencv使Photoshop达到色彩平衡

c++ - 在构造函数之后立即编程 SegFaults。 C++

c++ - 快速且无锁的单写入器,多个读取器

c++ - 在这种情况下,哪种设计模式可以很好地实现运行时多态性?

c++ - if 语句总是执行

c++ - 将 int* 转换为字符串,然后将字符串转换为 int*

c++ - 使用 OpenCV,尝试提取 ArrayOfArrays 描述的图片区域