我在Android设备上使用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)
上述原型是针对FastCV的侵蚀实现,其中没有参数来调整侵蚀的大小。鉴于FastCV已经针对移动架构进行了优化,并且我怀疑它实际上使用了我用于测试的Galaxy Nexus中的GPU,这个功能比上面的要快得多。但是,我需要多次循环并在同一帧上运行它以达到相同的侵蚀水平,从而牺牲了过程中的任何性能优势。
是否有人知道:
答案 0 :(得分:3)
如果您打算系统地连续执行这两个操作(侵蚀和扩张),并且如果您对这两个操作使用相同的参数大小,那么您可能想尝试使用opencv的专用函数应用一个开头:
http://docs.opencv.org/doc/tutorials/imgproc/opening_closing_hats/opening_closing_hats.html
数学上这相当于执行和侵蚀,然后是扩张,但是开放的优化实现可以通过连续应用这两个操作来更快地完成。
免责声明:我没有检查opencv对这些操作的实现,但你想尝试一下 - 如果你还没有完成它的话。