Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 检测图像中线条的好方法?_Opencv_Image Processing_Feature Detection_Edge Detection_Hough Transform - Fatal编程技术网

Opencv 检测图像中线条的好方法?

Opencv 检测图像中线条的好方法?,opencv,image-processing,feature-detection,edge-detection,hough-transform,Opencv,Image Processing,Feature Detection,Edge Detection,Hough Transform,我已经编写了一些代码,使用OpenCV库来检测草上画的白线。我需要有人对我使用的方法发表意见(因为我确信有比我更好的方法)。此外,我得到的结果并没有我预期的那么好,因为图像中的细微变化需要调整参数(我需要对固定参数进行操作) 我目前的做法是: 从网络摄像头抓取图像(并明显变为灰度) 通过阈值过滤器运行它(使用THRESH_TO_ZERO模式,将低于阈值的所有像素归零) 模糊图像 让它通过腐蚀过滤器 通过一个精明的边缘检测器进行检测 最后,获取处理后的图像,并使用概率Hough变换HoughLin

我已经编写了一些代码,使用OpenCV库来检测草上画的白线。我需要有人对我使用的方法发表意见(因为我确信有比我更好的方法)。此外,我得到的结果并没有我预期的那么好,因为图像中的细微变化需要调整参数(我需要对固定参数进行操作)

我目前的做法是:

  • 从网络摄像头抓取图像(并明显变为灰度)
  • 通过阈值过滤器运行它(使用THRESH_TO_ZERO模式,将低于阈值的所有像素归零)
  • 模糊图像
  • 让它通过腐蚀过滤器
  • 通过一个精明的边缘检测器进行检测
  • 最后,获取处理后的图像,并使用概率Hough变换HoughLinesP查找直线
  • 我应该改变过滤器的顺序吗

    另外,我不太关心处理能力;我正在GPU上运行HoughLinesP(B-)

    另外,下面是一个示例图像:

    我得到的结果是: 精明地 不带canny(稍微调整参数)

    任何帮助或指导都将不胜感激!我只是不知道该怎么做才能改善它

    更新 根据选择的答案使用了一个非常快速的骨架实现(带有大量模糊),我得到了以下结果:
    一种可能的解决方案是获取从canny边缘检测中获得的所有边缘点,并在这些点上使用线性最小二乘法(可能是迭代法)拟合直线。这样,您总是可以得到一条“最适合”边缘点的直线。这种方法几乎不涉及参数化。

    我会尝试使用图像的一个部分。canny的问题在于,由于线条的宽度,它基本上会产生两行


    然后我会对其应用Hough变换。

    我对室内图像使用Canny,但对于室外图像,我发现拉普拉斯滤波器和索贝尔滤波器比应用概率Hough线变换(PHT)更合适


    如果你想加粗你的线条,你应该尝试后拉普拉斯和最后的PHT。如果你的形象太多管闲事,它可能会变得更糟

    RANSAC算法可能是一种很好的方法。此方法类似于
    回归
    插值
    方法。您应该在使用
    边缘检测
    后提取点(如我所想,最好的方法是
    canny
    )。那么你应该找到最好的路线。要找到通过多个点的线,有不同的方法,如线性回归或RANSAC。您可以在中找到有关
    RANSAC
    算法的实现和注释


    请注意,RANSAC和另一个实现这一目标的有用算法已经在
    OpenCV
    (我在3.2版中知道)和
    Accord NET
    (图像处理的免费库)中实现了

    在上次结果之后(在骨架过滤器之后),您会得到许多小片段。我认为您在这一点上处于非常好的位置,可以实现本文中所做的工作:


    基本上,它们提供了根据不同特征属于同一对象的可能性来重新组合图像中不同特征的工具。因此,您所要做的就是将结果输入到他们的算法中,您可能会得到一条直线作为结果。

    在阈值化之后运行模糊是有原因的吗?在我看来,颠倒这两个步骤更符合逻辑。快速搜索给了我以下相应的opencv和matlab代码也可用@我不知道我为什么那样做。我最初没有使用模糊,然后我添加了它。我会尝试颠倒顺序,然后再给你回复。无论如何谢谢你@G453这看起来很有前途!谢谢你的链接!我将阅读它,看看我能做什么……“腰果”是一个很好的做法,在应用阈值之前应用低通滤波器,以去除高频噪声(在这种情况下,我们可以考虑草纹理作为噪声)。但是有一个问题:如果我使用最小二乘法和霍夫线变换,会有什么不同?是否有一个显著的优势(除了计算能力,这对我来说并不重要)最小二乘法的优势是获得一条直线作为输出,而Hough变换可能提供多条直线(我在您的结果中注意到)。关于敏感性,我同意,这就是为什么你可以使用迭代方法,在每次迭代中过滤掉异常值。或者,你可以执行RANSAC与最小二乘法的结合,甚至可以单独执行RANSAC来获得你需要的结果。RANSAC听起来是个好主意,但我现在没有时间了,我可能会使用另一种方法。不过,谢谢!杰出的我使用侵蚀法试图获得相同的结果,但我从未想过动态应用它(刚好足够,只剩下一条线)。。。我会试一试,然后再打给你。谢谢天哪,这正是我需要的!是阿马阿津!原来我只是简单地应用了腐蚀过滤器,而我需要额外的步骤来获得骨架!现在,我得到了直线的完美线段。我所要做的就是想办法把他们连在一起。。。非常感谢这可能是一个愚蠢的问题,但在骨架表示之后必须应用canny过滤器,不是吗?所以它不能代替精明的边缘检测器吗?@BlackMamba很抱歉这么晚才回复。骨架表示为您留下了单像素宽度的“骨架”。所以在那一点之后就不需要运行精明的边缘检测器了,因为剩下的只是边缘。@JonesV,链接断了。对不起,什么是PHT?请详细说明并更加具体。:)对不起,PHT代表概率霍夫线变换。哦,好的。但是怎么做呢