Image processing 圆Hough变换的CUDA实现

Image processing 圆Hough变换的CUDA实现,image-processing,cuda,hough-transform,Image Processing,Cuda,Hough Transform,我试图在CUDA中实现一个性能最高的圆Hough变换,边缘像素坐标在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; rad

我试图在CUDA中实现一个性能最高的圆Hough变换,边缘像素坐标在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;
    }
}
int maxRadius=100;
int minRadius=20;
int imageWidth=256;
int-imageHeight=256;
int houghSpace[imageWidth x imageHeight*maxRadius];
对于(整数半径=最小半径;半径<最大半径;++半径)
{
对于(浮点θ=0.0;θ<180.0;++θ)
{
xCenter=边坐标X+(半径*cos(θ));
Y中心=边缘坐标+(半径*sin(θ));
霍夫空间[X中心,Y中心,半径]+=1;
}
}
我的基本想法是让每个线程块计算输出Hough空间的一个(小)块(可能每行输出Hough空间一个块)。因此,我需要以某种方式将输入图像的所需部分放入共享内存中,以便在特定的输出子hough空间中执行投票

我的问题如下:

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

  • 如何检索以前存储在共享内存中的边缘像素的x、y坐标

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


  • 提前感谢大家抽出时间。我是CUDA的新手,在此方面的任何帮助都将不胜感激。

    我并不自称对这种过滤了解很多,但从源传播特征的基本思想听起来与求解静止Eikonal方程的行进法和扫掠法没有太大区别。有一篇关于解决这类问题的非常好的论文(PDF可能仍然可用):

    Eikonal方程的快速迭代法。袁启正,罗斯·T。 惠特克。暹罗科学计算杂志,第30卷,第5期, 第2512-2534页,2008年

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


    我不认为有必要尝试回答您的问题,除非您有一个更具体的算法方法,并开始了解实现细节

    请修复代码中的语法错误。您在这里要求我们的是为您做好工作。我建议你读这两本书,你自己就能回答。1:2:RoBiK-这是伪代码,只是为了让大家明白这一点。KiaMorot-如果我自己知道答案,我就不会在这里发布了。@MrX显然,但你也没有读过那些文档,是吗?如果你有,你会知道答案的…+1,因为你的答案很好。你提到的方法也被称为“快速行进法”,不久前,我读到它也被用于图像分割和处理。@jackolantern:不,它不是快速行进法。FMM是一类Djikstra算法,使用优先级队列与窄带迎风数值哈密顿量相结合,基本上是串行的。Jeong和Whitaker算法更接近于Osher风格的扫描方法,并且比FMM中可能的并行性更强。是的,你是对的。“快速迭代法”比“快速行进法”更为并行,严格来说,它们是不同的算法。谢谢你,但这并没有完全解决我的问题,也没有真正的相关性。