A good approach for detecting lines in an image?

38,123

Solution 1

I would try to use a skeleton representation of the image. The problem with your canny, here, is that it basically results in two lines because of the width of the line.

Then I would apply the Hough transform on it.

Solution 2

I was using Canny for indoor images, but for outdoor I find more suitable the Laplace filter and Sobel filter, than apply Probabilistic Hough line Transform (PHT).

If u want to thicker your lines, you should try the Sobel operator after Laplace and finally the PHT. If your image is too nosy it might get worse.

Solution 3

One possible solution is to take all the edge points that you obtain from the canny edge detection and fit a line using linear least sqaures (maybe iterative) on these points. This way you always get a single line that "best fits" the edge points. There is virtually no parametrisation involved with this method.

Solution 4

RANSAC algorithm may be a good method. This method is similar to regression or interpolation approaches. You should extract points after using an edge detection(best method is canny for this goal as I think). Then you should find best line. For finding the line passing through several points there are different methods such as linear regression or RANSAC. You can find implementation and notes about RANSAC algorithm in this link.

Note that RANSAC and another useful algorithms for this goal are already implemented in OpenCV (as I know in version 3.2) and in Accord NET (a free library for image processing).

Share:
38,123
Cashew
Author by

Cashew

Updated on January 27, 2020

Comments

  • Cashew
    Cashew over 4 years

    I've written some code that uses OpenCV libraries to detect white lines painted on grass. I need someone's opinion on the approach I used (as I'm sure there's a much better way than mine). Also, the results I'm getting are not as good as I expected because slight variations in the image require tweaking the parameters (and I need to operate on fixed parameters).

    My approach so far:

    1. Grab image from webcam (and turn into grayscale obviously)
    2. Run it through a threshold filter (using THRESH_TO_ZERO mode, where it zeros out any pixels BELOW the threshold value).
    3. blur the image
    4. run it through an erosion filter
    5. run it through a Canny edge detector
    6. finally, take this processed image and find the lines using Probabilistic Hough Transform HoughLinesP

    Should I change the sequence of the filters?

    P.S. I'm not too concerned about processing power; I'm running the HoughLinesP on the GPU B-)

    Also, here is a sample image: original image

    The results I'm getting: with canny with canny WITHOUT canny (slightly tweaked parameters) no canny this time

    Any help or guidance would be appreciated! I just have no idea what to do to improve it!

    UPDATE After using a really quick skeleton implementation (with TONS of blur) as per the chosen answer, I got this: it works!

  • Cashew
    Cashew almost 11 years
    Well, all the preprocessing (including Canny) have a lot of parameters. One question, though: what difference would it make if I use the least squares method vs. the Hough Line transform? Is there a significant advantage (besides computation power, which isn't important to me)
  • Zaphod
    Zaphod almost 11 years
    The advantage of least squares would be getting one single line as output, while the Hough transform might provide multiple lines (which I noticed in your result). Re the sensitivity, I agree, which is why you probably could do with an iterative method wherein outliers are filtered out with every iteration. Alternately, you could perform RANSAC coupled with least squares, or even RANSAC on its own to obtain the result you need.
  • Cashew
    Cashew almost 11 years
    Excellent! I was using erosion trying to achieve the same results, but I never thought to dynamically apply it (just enough so that only a single line remains)... I will give it a go, and will get back to you. Thanks!
  • Cashew
    Cashew almost 11 years
    RANSAC sounds like a good idea, but I'm running out of time for now and I'll probably go with another method. Thanks, though!
  • Cashew
    Cashew almost 11 years
    OMG this is EXACTLY WHAT I NEEDED! It's AMAAAAZING! It turns out that I was simply applying an erosion filter, when I needed a few extra steps to obtain the skeleton! Now, I'm getting PERFECT line segments of the line. All I need to do is figure out how to join them into one line... THANK YOU SO MUCH! :D
  • BlackMamba
    BlackMamba over 10 years
    This may be a dumb question, but one has to apply the canny filter after the skeleton representation, doesn't he? So it is no replacement for the canny edge detector?
  • Cashew
    Cashew over 10 years
    I'm sorry, but what is PHT? Please elaborate and be more specific. :)
  • Elod
    Elod over 10 years
    Sorry, PHT stands for Probabilistic Hough line Transform.
  • Cashew
    Cashew over 10 years
    Oh, ok. But how do you get your PHT to grab the lines if your edges are a little rough and curvey (like in my last picture)?
  • Cashew
    Cashew about 10 years
    @BlackMamba so sorry for the late reply. The skeleton representation leaves you with single-pixel-width "skeletons". So there's no need to run a canny edge detector after that point, because all you're left with are edges.
  • Cashew
    Cashew about 10 years
    at what stage should the dissolve be applied? You mean right before the PHT?
  • Elod
    Elod about 10 years
    Yes before PHT, I also enhanced/sharpened the the the with parts of the image.
  • CroCo
    CroCo almost 9 years
    @JonesV, the link is broken.
  • Haresh Chhelana
    Haresh Chhelana over 7 years
    @JonesV Can you please help me for this : stackoverflow.com/questions/39975618/…