为什么cv :: cuda :: createMedianFilter函数比cv :: medianBlur慢?

时间:2016-07-03 14:59:41

标签: opencv gpu opencv3.1

如您所知,Ptr<Filter> cv::cuda::createMedianFilter (int srcType, int windowSize, int partition=128)函数已添加到OpenCV3.1.0。

我正在尝试使用自定义窗口大小(最多21个)对8位大图像(6000 * 6000)进行中值滤波。我比较了cv::medianBlurcv::cuda::createMedianFilter,结果是

windowSize    cv::medianBlur    cv::cuda::createMedianFilter
    3             0.071 sec         3.637 sec
    5             0.285 sec         3.679 sec
    11            2.641 sec         3.652 sec
    19            2.566 sec         3.719 sec

1)为什么cuda :: createMedianFilter比cv :: medianBlur慢?

2)我如何编写内核代码来实现使用opencv Mat和自定义内核大小的中值过滤器?

2 个答案:

答案 0 :(得分:1)

当图像大小恒定时,卷积操作的速度主要取决于滤波器内核的大小。考虑到排序比求和更复杂,中值滤波器将花费更长的时间。

要使用自定义过滤器内核实现自己的CUDA卷积功能,需要获取图像数据的原始指针

ReactDOM.findDOMNode(this.refs.query).value

然后编写CUDA代码。

这是关于cuda卷积的教程。

http://igm.univ-mlv.fr/~biri/Enseignement/MII2/Donnees/convolutionSeparable.pdf

这个问题也举了一个例子。

cuda convolution mapping

答案 1 :(得分:0)

我还使用了cuda::createMedianFilter()并发现每次调用MedianFilter::apply()时在filter->apply()中新分配了两个GpuMat,并且GPU内存分配非常耗时,所以我移动了两个Mats将MedianFilter类作为成员变量(除非图像大小发生变化,否则不再分配)。

使用1000张图像(400 * 300)加速测试4倍。此外,似乎参数分区可以设置为src.rows / 2,这将比原始参数-128更快。

src code中的两个席位是GpuMat devHist; GpuMat devCoarseHist