在我的系统上,对于窗口大(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
答案 0 :(得分:3)
以Eric的回答为基础:
Npp CUDA库没有实现adaptiveThreshold,但是以非常直接的方式获得自适应阈值似乎是有益的(只是测试它并且传闻有效):
src
上运行一个框过滤器(即计算每个像素的平均窗口值),
存储在中间图像tmp
。tmp
src
和之间运行比较功能
tmp
dst
。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);
。结束。代码可能如下所示(此处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