pythonalgorithmopencvfilterstraight-line-detection

Extract lines from image with python


I need to extract path/lines from an image. I apply laplacian filter to this input. In laplacian filtered image, the lines to be extracted can be seen as low value pixels connected to form a linear object with high value pixels forming its border (defining the thickness of the linear path). The issue is there are many more pixels between these lines which also have similar values. Setting threshold to extract these lines does not work. Applying filters like entropy or gabor filter also did not work. With HoughP or Hough Transformation nothing meaningful comes out, probably arguments are not set properly. I need help extracting these lines/path from the image.


Solution

  • The code below uses cv2.HoughLinesP() on the thresholded image to produce this: enter image description here

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Threshold 
    img = cv2.imread("subset_comp.tif")
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    _, img_thr = cv2.threshold(img_gray, 150, 255, cv2.THRESH_BINARY)
    fig, axs = plt.subplots(1, 2)
    axs[0].set_title("Thresholded")
    axs[0].imshow(img_thr, aspect="auto", cmap="gray")
    
    # Find lines
    lines = cv2.HoughLinesP(
        img_thr, rho=1, theta=np.pi / 180, threshold=128, minLineLength=600, maxLineGap=30,
    )
    lines = lines.squeeze()
    axs[1].set_title("Grayscale with Lines")
    axs[1].imshow(img_gray, aspect="auto", cmap="gray")
    for x1, y1, x2, y2 in lines:
        axs[1].plot([x1, x2], [y1, y2], "r")
    fig.show()