2013-07-19 62 views
1

我试图在CUDA中实现最大性能Circle Hough变换,借此边缘像素坐标在Hough空间中投票。红隧伪代码如下,我使用的256×256像素的图像大小:CUDA实现Circle Hough变换

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的新手,任何与此有关的帮助都会非常感激。

+0

请修复你的代码中的语法错误 – RoBiK

+0

你在这里问我们的是为你工作。我建议你这两个读数,你可以自己回答。 1:http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html 2:http://docs.nvidia.com/cuda/cuda-c-best-practices-guide /index.html – KiaMorot

+0

RoBiK - 这是伪代码,只是为了说明问题。 –

回答

3

我并不知道对这种过滤有太多的了解,但从源头传播特征的基本思想听起来与行进和扫描方法不同,它不能解决固定的Eikonal方程。有关于解决这类问题的非常好的论文(PDF可能仍然可用here):

Eikonal方程的快速迭代法。 Won-Ki Jeong,Ross T. Whitaker。 SIAM杂志上的科学计算,第30卷第5期, pp.2512-2534,2008年

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

我不认为值得试图回答你的问题,直到你有一个更具体的算法的方法,并进入实施细节。

+0

+1为您的非常好的答案。你提到的方法也被称为“快速前进”,并且在很久以前,我已经读过它也用于图像分割和处理。 – JackOLantern

+0

是的,你是对的。 “快速迭代法”比“快速推进法”更加平行,严格来说,它们是不同的算法。 – JackOLantern