4

在我的系统上,对于具有大窗口大小(75 像素)的 5 MP 图像,它需要高达140 毫秒(大约是线性操作的 20 倍)才能完成,我正在寻求对其进行优化。我注意到 OpenCV gpu 模块没有实现 gpu 版本,adaptiveThreshold所以我一直在考虑自己为 GPU 实现该算法。

如果我在 CUDA 中实现自适应阈值算法,基于大窗口大小 (50px+) 和大图像 (5 MP+),忽略将内存加载到 GPU 中的开销,我能否希望任何加速?

adaptiveThresholdopencv.org 上的文档:

http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html#adaptivethreshold

4

3 回答 3

3

基于 Eric 的回答:

Npp CUDA 库没有实现adaptiveThreshold,但它似乎有利于以非常直接的方式获得自适应阈值(刚刚对其进行了测试并且传闻有效):

  1. 运行一个盒子过滤器src(即计算每个像素的平均窗口值),存储在中间图像tmp中。
  2. 从每个像素中减去一个数字 Ktmp
  3. src在和 tmpinto之间运行比较函数dst。结束。

代码可能如下所示(此处 K=0,省略第 2 步):

nppiFilterBox_8u_C1R(oDeviceSrc.data(), oDeviceSrc.pitch(),
                                  oDeviceIntermediate.data(), oDeviceDst.pitch(),
                                  oSizeROI, oAdapThreshWindowSize,oAnchor);
nppiCompare_8u_C1R(oDeviceSrc.data(),oDeviceSrc.pitch(),
                   oDeviceDst.data(),oDeviceDst.pitch(),
                   oDeviceResult.data(),oDeviceResult.pitch(),
                   oSizeROI,NPP_CMP_LESS);

此外,维基百科声称连续 3 次应用盒式过滤器可使高斯过滤器的准确率接近 97%。

于 2013-10-01T16:21:51.407 回答
2

是的,这个算法可以在 GPU 上进行优化。我希望看到一个出色的加速。

对于ADAPTIVE_THRESH_MEAN_C,您可以使用标准并行归约来计算算术平均值。对于ADAPTIVE_THRESH_GAUSSIAN_C,您可以使用执行每像素高斯衰减的内核,并结合标准并行减少求和。

于 2013-10-01T15:00:27.780 回答
1

CUDA 的实施应该会给您带来满意的性能提升。

由于您的窗口很大,因此此操作应该是计算受限的。Tesla K20X GPU上 75px 窗口的 5 MP 图像的理论峰值性能应该约为

5e6 * 75 * 75 / 3.95 Tflops = 7ms

这是关于图像卷积的白皮书。它展示了如何使用 CUDA 实现高性能的 box filer。

http://docs.nvidia.com/cuda/samples/3_Imaging/convolutionSeparable/doc/convolutionSeparable.pdf

Nvidia cuNPP库也提供了一个函数nppiFilterBox(),可以ADAPTIVE_THRESH_MEAN_C直接使用。

http://docs.nvidia.com/cuda/cuda-samples/index.html#box-filter-with-npp

对于ADAPTIVE_THRESH_GAUSSIAN_CnppiFilter()可以使用具有适当掩码的函数。

NPP doc pp.1009 http://docs.nvidia.com/cuda/pdf/NPP_Library.pdf

于 2013-10-01T15:01:01.277 回答