2

我正在从一个简单的控制台应用程序(.net 4.0 和 c#)中使用 EmguCV 2.3.0.1416,我对 canny、边缘检测等有疑问。给定以下代码:

var colours = new[]
                  {
                      new Bgr(Color.YellowGreen),
                      new Bgr(Color.Turquoise),
                      new Bgr(Color.Blue),
                      new Bgr(Color.DeepPink)
                  };

// Convert to grayscale, remove noise and get the canny
using (var image = new Image<Bgr, byte>(fileName)
    .Convert<Gray, byte>()
    .PyrDown()
    .PyrUp()
    .Canny(new Gray(180),
           new Gray(90)))
{
    // Save the canny out to a file and then get each contour within
    // the canny and get the polygon for it, colour each a different
    // colour from a selection so we can easily see if they join up
    image.Save(cannyFileName);

    var contours = image
        .FindContours(CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,
                      RETR_TYPE.CV_RETR_EXTERNAL);

    using (var debug = new Image<Bgr, byte>(image.Size))
    {
        int colIndex = 0;
        for (; contours != null; contours = contours.HNext)
        {
            Contour<Point> poly = contours
                .ApproxPoly(contours.Perimeter*0.05,
                            contours.Storage);

            debug.Draw(poly, colours[colIndex], 1);

            colIndex++;
            if (colIndex > 3) colIndex = 0;
        }

        debug.Save(debugFileName);
    }
}

我得到了这个输出(这实际上只是图像的一部分,但它显示了我在问什么):

精明边缘

正如你所看到的,它有一条带一点粉红色的蓝线,然后是一条绿线。真实的东西在这里只有一个坚实的边缘,所以我希望这是一条线,以便我可以确定它是我所看到的边缘。

原始图像看起来像这样(我已经放大了它,但你可以看到它有一个非常独特的边缘,我希望能够很容易地找到它)。

原版

如果我只看精明,我可以看到那里的差距,所以我尝试调整创建精明的参数(阈值和链接阈值),但它们没有任何区别。

我还扩张然后侵蚀了精明(顺便说一下,对迭代参数使用相同的值 - 10),这似乎可以解决问题,但是这样做我会不会失去准确性(只是感觉有点不对劲)?

那么,我应该如何确保在这种情况下得到单行呢?

4

3 回答 3

2

Did you try smoothing before canny?

I found this link, maybe useful for you

http://www.indiana.edu/~dll/B657/B657_lec_hough.pdf

于 2012-05-02T11:06:04.307 回答
0

单行到底是什么意思?也许你正试图加粗你的线:

debug.Draw(poly, colours[colIndex], 2);

代替:

debug.Draw(poly, colours[colIndex], 1);

或者你想要的任何粗细的线。 这是多边形的 emgucv 绘制方法。也许也看看这个链接。

于 2012-04-28T01:47:57.170 回答
0

approxPoly() 函数中的第一个参数正是您要寻找的。只要摆弄它,你就会得到你想要的。

于 2013-06-06T03:02:04.240 回答