如何使用CUDA或OpenCL加速块匹配算法?

时间:2015-09-17 12:20:14

标签: python algorithm image-processing cuda gpgpu

我想知道如何使用CUDA或OpenCL来加速我的Python块匹配算法,因为这样的算法应该是高度并行的。目前,我的算法的工作原理如下:

For some blocks B1_i of the first image:
  For blocks B2_j (in the neighborhood of B1_i) in the second image:
    Find the block which minimizes the distance d(B1_i,B2_j)

由于我的代码目前需要大约1小时,我想避免第一个循环,即我想以并行方式处理所有的B1_i块。

然而,当我尝试在第二个图像上找到最相似的块时,我需要使用一些特定的函数,例如使用scikit-learn的内核密度估计,所以这部分理想情况下应该用Python编写。

你认为这是一种“聪明”的做法吗?

编辑:

我对我的代码进行了描述,并且我意识到最慢的部分是联合直方图估计。到目前为止,我已经通过scikit-learn(KernelDensity)使用高斯核密度估计来实现这一点,并且看起来numpy histogram2d函数更快。但是,我想我仍然可以提高这一部分的速度,但我想知道如何。

你认为用C或C ++等低级语言重写2D联合直方图会有所帮助吗?

1 个答案:

答案 0 :(得分:2)

为其中一个图像保持块静态(例如:block_1将始终为x:0 y:0 w:64 h:64,2将为x:64 y:0 w:64 h:64)并且对于另一个图像,根据您的邻域阈值创建所有可能的块。

For y = -NeighborHoodThresholdY To NeighborHoodThresholdY
    For x = -NeighborHoodThresholdX To NeighborHoodThresholdX
        // parallelize
        FOr Each block2 In image2
            // separate thread / task / kernel
            block1 = image1.Region(block2.X + x, block2.Y + y, block2.Width, block2.Height)
            Compare(block1, block2)
        Next
    Next
Next