【问题标题】:Fastest way to get number of white pixels in a binary image using OpenCV使用 OpenCV 获取二进制图像中白色像素数量的最快方法
【发布时间】:2013-05-31 12:27:57
【问题描述】:

使用 OpenCV 获取二进制图片中白色像素数量的最快方法是什么?有没有比使用两个 for 循环并逐像素访问图像更快的方法?

【问题讨论】:

  • 图像是真灰度还是二值图像?
  • @Aurelius:它实际上是二进制图像,我应该在问题中写出来。

标签: c# opencv emgucv


【解决方案1】:

最简洁的方法是:

cv::Mat image, mask;    //image is CV_8UC1
cv::inRange(image, 255, 255, mask);
int count = cv::countNonZero(mask);

如果您对二进制图像进行操作,则无需调用cv::inRange(),只需cv::countNonZero() 就足够了。

尽管任何方法都必须遍历所有像素,但这可能能够利用 OpenCV 的内置 parallel_for_(),它允许并行执行。

如果您的图像是连续的,您可以使用单个循环遍历所有数据。

【讨论】:

  • 谢谢,cv::inRange 是我想要的!我实际上是通过 EmguCV 包装器(在 C# 中)使用 OpenCV,这一行将我的程序加速了大约 40%。你知道为什么在两个 for 循环中循环要慢得多吗?
  • 我对 C# 不是很熟悉,但我相信它会在您循环迭代时进行边界检查,这可以解释一些性能差异。
  • 谢谢,边界检查确实减慢了速度。但是在我禁用边界检查之后,对于一张非常大的图片 (10240x7680),CV 函数大约需要 70 毫秒,两个 for 循环大约需要 350 毫秒。使用 Parallel.For 后,两个循环的方法大约需要 200 毫秒,但这仍然比 OpenCV 实现要长得多。
  • 许多 OpenCV 函数也采用了硬件优化。 cv::countNonZero()` 特别是使用 SSE 进行矢量化处理,这说明了性能差异的其余部分。
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 2012-05-17
  • 2015-09-01
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多