1

我正在尝试在 CUDA 中实现最大性能的圆形霍夫变换,从而边缘像素坐标在霍夫空间中投票。CHT 的伪代码如下,我使用的是 256 x 256 像素的图像大小:

int maxRadius = 100;
int minRadius = 20;
int imageWidth = 256;
int imageHeight = 256;

int houghSpace[imageWidth x imageHeight * maxRadius];

for(int radius = minRadius; radius < maxRadius; ++radius)
{
    for(float theta = 0.0; theta < 180.0; ++theta)
    {
        xCenter = edgeCoordinateX + (radius * cos(theta));
        yCenter = edgeCoordinateY + (radius * sin(theta));

        houghSpace[xCenter, yCenter, radius] += 1;
    }
}

我的基本想法是让每个线程块计算输出霍夫空间的(小)块(可能输出霍夫空间的每一行一个块)。因此,我需要以某种方式将输入图像的所需部分放入共享内存中,以便在特定的输出子霍夫空间中进行投票。

我的问题如下:

  1. 如何计算输入图像所需部分的坐标并将其存储在共享内存中?

  2. 如何检索以前存储在共享内存中的边缘像素的 x,y 坐标?

  3. 我是在另一个共享内存数组中投票还是直接将投票写入全局内存?

提前感谢大家的时间。我是 CUDA 的新手,我们将不胜感激地收到任何帮助。

4

1 回答 1

3

我自称对这种过滤了解不多,但是从源传播特征的基本思想听起来与求解固定 Eikonal 方程的行进和扫描方法并没有太大不同。有一篇关于解决此类问题的非常好的论文(PDF 可能仍可在此处获得):

Eikonal 方程的快速迭代方法。Won-Ki Jeong,罗斯 T. 惠特克。SIAM 科学计算杂志,第 30 卷,第 5 期,第 2512-2534 页,2008 年

其基本思想是将计算域分解为瓦片,并将特征从源头扫过域。当瓷砖被推进特性所触及时,它们会被添加到活动瓷砖列表中并进行计算。每次“解决”一个图块(在 Eikonal 情况下收敛到一个数值容差,可能是您的问题中的一个状态)时,它就会从工作集中退出并激活它的邻居。如果再次触摸磁贴,则会将其重新添加到活动列表中。该过程继续进行,直到计算完所有图块并且活动列表为空。每次计算迭代都可以通过内核启动来解决,它显式地同步计算。根据需要连续运行尽可能多的内核,以达到一个空的工作列表。

在您拥有更具体的算法方法并进入实现细节之前,我认为不值得尝试回答您的问题。

于 2013-07-20T10:10:39.093 回答