【问题标题】:FastCV Erode/Dilate ParametersFastCV 腐蚀/膨胀参数
【发布时间】:2012-08-15 13:25:03
【问题描述】:

我在安卓设备上同时使用 OpenCV 和 FastCV 来执行一些图像处理操作。在对帧进行阈值处理后,我得到了一张二值图像,在感兴趣区域附近存在适量的黑白噪声。

执行腐蚀,然后对图像进行膨胀,可以得到一个几乎无噪声的图像,可用于进一步处理,但是上述两个库都有其缺点。

OpenCV

Mat element = getStructuringElement(MORPH_RECT, Size(2 * erosionSize + 1, 2 * erosionSize + 1), Point(erosionSize, erosionSize));
erode(in, in, element);
element.release();

请原谅我的神奇数字,但我对 OpenCV 侵蚀/扩张的简单调用看起来像上面那样。然后我可以修改它的erosionSize/dilationSize 参数,以调整该函数在消除噪音方面的积极程度。问题?性能在这里是重中之重,这个函数的运行速度比我想要的要慢。

FastCV

fcvFilterErode3x3u8_v2 (const uint8_t *__restrict src, unsigned int srcWidth, unsigned int srcHeight, unsigned int srcStride, uint8_t *__restrict dst, unsigned int dstStride)

上面的 prototpye 是针对 FastCV 的 erode 实现的,这里没有参数来调整腐蚀的大小。鉴于 FastCV 已针对移动架构进行了优化,并且我怀疑它实际上利用了我用于测试的 Galaxy Nexus 中的 GPU,因此此功能比上述功能要快得多。但是,我需要在同一帧上多次循环和运行它以实现相同程度的侵蚀,从而牺牲了过程中的任何性能优势。

有人知道吗:

  • 我可能在任一 API 中遗漏的任何方法都将快速执行并使用可调大小参数
  • 任何其他包含符合这两个要求并具有相当宽松许可的函数的库。

【问题讨论】:

  • FastCV 在 Galaxy Nexus 上不使用 GPU,至少因为它是 TI 芯片。

标签: c++ image-processing opencv android-ndk


【解决方案1】:

如果您的意图是系统地连续执行这两种操作(腐蚀和膨胀),并且如果您可以对两者使用相同的参数大小,那么您可能想尝试使用 opencv 的专用函数应用一个开口:

http://docs.opencv.org/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.html

从数学上讲,这相当于先执行腐蚀然后再膨胀,但有优化的开环实现可以比连续应用这两个操作更快。

免责声明:我还没有检查过 opencv 对这些操作的实现,但你会想尝试一下——当然,如果你还没有做过。

【讨论】:

  • 我已经尝试过了,我面临的问题是膨胀需要大于腐蚀才能填充阈值区域中的白噪声孔。感谢您的建议!
  • 但是时间上的收获呢?
  • 实际上,如果时间增益足够大,您可以应用关闭(这是填充白洞的典型操作,但也可能会根据您的限制进行过多的处理)或小尺寸:因为开口相当于
  • 我可以执行打开,然后是较小的扩张,正如您所说,这在数学上相当于一个小侵蚀,然后是一个大扩张。但是,我无法想象 open+dilate 会比 erode+dilate 执行得更快。无论如何,我都会尝试对其进行分析。我可能会感到惊讶。
  • 在最终分析后,open+dilate 和 erode+dilate 之间的速度似乎没有明显差异。
猜你喜欢
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
相关资源
最近更新 更多