使用 OpenCV 获取二进制图像中白色像素数量的最快方法

Posted

技术标签:

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

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

【问题讨论】:

图像是真灰度还是二值图像? @Aurelius:它实际上是二进制图像,我应该在问题中写出来。 【参考方案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 进行矢量化处理,这说明了性能差异的其余部分。

以上是关于使用 OpenCV 获取二进制图像中白色像素数量的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

使用opencv获取(内边缘)轮廓像素

通过分析二进制前景图像的白色像素来计算车辆计数所需的想法

OpenCV - 从图像中获取灰度值

在 OpenCV python 中将白色像素转换为黑色

检测白色像素密度低的区域

如何计算二进制图像上的白色物体?