在opencv二进制图像中计算“白色”像素(高效)

时间:2011-12-07 17:45:47

标签: c++ optimization image-processing opencv

我正在尝试计算OpenCV二进制图像中的所有白色像素。我目前的代码如下:

  whitePixels = 0;
  for (int i = 0; i < height; ++i)
    for (int j = 0; j < width; ++j)
      if (binary.at<int>(i, j) != 0)
        ++whitePixels;

然而,在使用gprof进行分析之后,我发现这是一段非常慢的代码,并且在程序中存在很大的瓶颈。

是否有一种可以更快地计算相同值的方法?

4 个答案:

答案 0 :(得分:22)

cvCountNonZero。通常,任务的OpenCV实现都经过了大量优化。

答案 1 :(得分:0)

您可以使用并行计算。您将图像划分为N个部分并在不同的线程中运行您的代码,然后您获得每个线程的结果,然后您可以添加此结果以获取最终数量。

答案 2 :(得分:-2)

一行中的最后一个像素通常后跟下一行中的第一个像素(C代码):

limit=width*height;
i=0;
while (i<limit)
{
  if (binary.at<int>(0,i) != 0) ++whitePixels;
  ++i;
}

答案 3 :(得分:-2)

实际上binary.at<int>(i, j)访问速度很慢!

以下是比您更快访问的简单代码。

for (int i = 0; i < height; ++i)
{
uchar * pixel = image.ptr<uchar>(i);
    for (int j = 0; j < width; ++j)
{
  if(pixel[j]!=0)
   {
      //do your job
   }
}
}