在我的系统中,对于一个大窗口大小(75 am )的5 MP图像来说,要完成140 ms (大约是线性操作的20倍),我希望对其进行优化。我注意到OpenCV gpu模块没有实现adaptiveThreshold的gpu版本,所以我一直在考虑自己为GPU实现该算法。
如果我在CUDA中实现了一种基于大窗口大小(50px+)和大图像(5 MP+)的自适应阈值算法,而忽略了将内存加载到GPU的开销,我还能期望有任何加速吗?
关于adaptiveThreshold的opencv.org文档:
transformations.html#adaptivethreshold
发布于 2013-10-01 15:01:01
通过CUDA的实施应该会给你一个满意的性能增益。
由于您的窗口大小很大,这个操作应该是有计算界的。在特斯拉K20X GPU上,具有75 on窗口的5MP图像的理论峰值性能应该是大约
5e6 * 75 * 75 / 3.95 Tflops = 7ms这是一张关于图像卷积的白皮书。说明了如何用CUDA实现一个高性能的箱形报警器。
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文档NPP.1009 Library.pdf
发布于 2013-10-01 16:21:51
在埃里克回答的基础上:
Npp库没有实现adaptiveThreshold,但它似乎有利于以一种非常简单的方式获得一个自适应阈值(刚刚测试了它,而且很有用):
src上运行一个盒子过滤器(即计算每个像素的平均窗口值),存储在中间图像tmp中。tmp中的每个像素减去一个数字Ksrc和tmp之间的比较函数运行到dst中。结束了。代码可能如下所示(在这里,K=0省略了第二步):
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);此外,维基百科索赔要求表示,连续三次应用盒子过滤器,将高斯滤波器的准确度提高到97%。
发布于 2013-10-01 15:00:27
是的,这个算法可以在GPU上进行优化。我希望能看到一个很好的加速。
对于ADAPTIVE_THRESH_MEAN_C,可以使用标准的并行约简来计算算术平均值。对于ADAPTIVE_THRESH_GAUSSIAN_C,您可以使用一个内核来执行每像素的高斯衰减,并对和进行标准的并行缩减。
https://stackoverflow.com/questions/19118533
复制相似问题