我正在尝试在CUDA中实现最大性能Circle Hough变换,其中边缘像素坐标在霍夫空间中投票。 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;
}
}
我的基本想法是让每个线程块计算输出霍夫空间的(小)区块(输出霍夫空间的每一行可能有一个区块)。因此,我需要以某种方式将输入图像的所需部分放入共享存储器中,以便在特定输出子空间中进行投票。
我的问题如下:
如何在共享内存中计算和存储输入图像所需部分的坐标?
如何检索以前存储在共享内存中的边缘像素的x,y坐标?
我是否可以在另一个共享内存数组中投票或将投票直接写入全局内存?
提前感谢大家的时间。我是CUDA的新手,我将非常感激地对此提出任何帮助。
答案 0 :(得分:3)
我对这种过滤并不是很了解,但是从源头传播特征的基本思想与用于求解静态Eikonal方程的行进和扫描方法听起来并没有太大的不同。有一篇关于解决这类问题的非常好的论文(PDF可能仍然可用here):
Eikonal方程的快速迭代方法。 Won-Ki Jeong,Ross T. 惠特克。 SIAM科学计算期刊,第30卷,第5期, pp.2512-2534,2008
基本思想是将计算域分解为切片,并在域中扫描来自源的特征。随着瓷砖被前进特征所触及,它们被添加到活动瓷砖列表中并进行计算。每次瓦片“解决”(收敛到Eikonal案例中的数字公差,可能是您问题中的状态)时,它将从工作集退出并激活其邻居。如果再次触摸图块,则会将其重新添加到活动列表中。该过程将继续,直到计算完所有切片并且活动列表为空。每次计算迭代都可以通过内核启动来解决,它可以明确地同步计算。根据需要运行尽可能多的内核以达到空工作列表。
在您有更具体的算法方法并且正在深入了解实施细节之前,我认为不值得尝试回答您的问题。