CUDA编程的GPU是否适合实现OpenCV自适应阈值?

时间:2013-10-01 14:14:04

标签: opencv cuda

在我的系统上,对于窗口大(75px)的500万像素,需要高达<140秒(大约是线性操作的20倍)来完成,我希望优化它。我注意到OpenCV gpu模块没有实现adaptiveThreshold的gpu版本,所以我一直在考虑为GPU自己实现该算法。

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

关于opencv.org的

adaptiveThreshold文档:

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

3 个答案:

答案 0 :(得分:3)

以Eric的回答为基础:

Npp CUDA库没有实现adaptiveThreshold,但是以非常直接的方式获得自适应阈值似乎是有益的(只是测试它并且传闻有效):

  1. src上运行一个框过滤器(即计算每个像素的平均窗口值), 存储在中间图像tmp
  2. tmp
  3. 中的每个像素中减去数字K.
  4. src和之间运行比较功能 tmp dstnppiFilterBox_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); 。结束。
  5. 代码可能如下所示(此处K = 0,省略第2步):

    {{1}}

    此外,维基百科claims连续3次应用箱式滤波器近似于高斯滤波器,精度达到97%。

答案 1 :(得分:2)

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

对于ADAPTIVE_THRESH_MEAN_C,您可以使用标准的并行缩减来计算算术平均值。对于ADAPTIVE_THRESH_GAUSSIAN_C,您可以使用执行每像素高斯衰减的内核以及总和的标准并行缩减。

答案 2 :(得分:1)

CUDA的实施应该会让您获得满意的性能提升。

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

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

这是一篇关于图像卷积的白皮书。它展示了如何使用CUDA实现高性能的盒式文件管理器。

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_C,可以使用具有适当掩码的函数nppiFilter()

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