计算 opencv 二进制图像中的 'white' 像素(有效)

Count 'white' pixels in opencv binary image (efficiently)

本文关键字:像素 有效 white opencv 计算 二进制 图像      更新时间:2023-10-16

我正在尝试计算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进行分析之后,我发现这是一段非常慢的代码,并且是程序中的一个大瓶颈。

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

cv::CountNonZero。通常任务的OpenCV实现是经过大量优化的。

您可以使用并行计算。你把图像分成N部分,在不同的线程中运行你的代码,然后你得到每个线程的结果,之后你可以添加这个结果来获得最终的数量。

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

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

实际上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
   }
}
}