【问题标题】:Longest line detection - python - opencv最长线检测 - python - opencv
【发布时间】:2016-08-21 05:42:30
【问题描述】:

我需要检测给定图像中的最长线,我的图像将与此类似:

enter image description here

我在细化后尝试过,但是细化后图像变得像素化并且没有保持直线。

还有其他方法可以解决这个问题吗?

谢谢 光辉

【问题讨论】:

    标签: python opencv image-processing contour edge-detection


    【解决方案1】:

    你觉得这个解决方案怎么样?

    我在代码中包含了解释。总体思路是先做一个阈值化,提取黑色区域,然后寻找轮廓,挑出最长的。

    Dilation 已经完成了挑选出指针的所有工作,但我在里面留下了一些替代代码,用于查找最长的轮廓,以备不时之需。

    #!/usr/bin/env python
    
    import sys
    import numpy as np
    import cv2
    from matplotlib import pyplot as plt
    
    
    img = cv2.imread('image.jpg',0)
    print img.shape
    h, w = img.shape[:2]
    
    # Drop top and bottom area of image with black parts.
    img= img[100:h-100, :]
    h, w = img.shape[:2]
    
    # Threshold image
    ret,th1 = cv2.threshold(img,50,255,cv2.THRESH_BINARY)
    
    # get rid of thinner lines
    kernel = np.ones((5,5),np.uint8)
    th1 = cv2.dilate(th1,kernel,iterations = 3)
    
    # Determine contour of all blobs found
    _, contours0, hierarchy = cv2.findContours( th1.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    contours = [cv2.approxPolyDP(cnt, 3, True) for cnt in contours0]
    
    # Draw all contours
    vis = np.zeros((h, w, 3), np.uint8)
    cv2.drawContours( vis, contours, -1, (128,255,255), 3, cv2.LINE_AA)
    
    # Draw the contour with maximum perimeter (omitting the first contour which is outer boundary of image
    # Not necessary in this case
    vis2 = np.zeros((h, w, 3), np.uint8)
    perimeter=[]
    for cnt in contours[1:]:
        perimeter.append(cv2.arcLength(cnt,True))
    print perimeter
    print max(perimeter)
    maxindex= perimeter.index(max(perimeter))
    print maxindex
    
    cv2.drawContours( vis2, contours, maxindex +1, (255,0,0), -1)
    
    
    # Show all images
    titles = ['Original Image','Threshold','Contours', 'Result']
    images=[img, th1, vis, vis2]
    for i in xrange(4):
        plt.subplot(2,2,i+1)
        plt.imshow(images[i],'gray')
        plt.title(titles[i]), plt.xticks([]), plt.yticks([])
    plt.show()
    

    [编辑]

    您可以添加更多代码来将轮廓的主轴确定为一条线,如下所示:

    # Determine and draw main axis
    length = 300
    (x,y),(MA,ma),angle = cv2.fitEllipse(cnt)
    print  np.pi , angle
    print angle * np.pi / 180.0
    print np.cos(angle * np.pi / 180.0)
    x2 =  int(round(x + length * np.cos((angle-90) * np.pi / 180.0)))
    y2 =  int(round(y + length * np.sin((angle-90) * np.pi / 180.0)))
    cv2.line(vis2, (int(x), int(y)), (x2,y2), (0,255,0),5)
    print x,y,x2,y2
    

    【讨论】:

    • 谢谢伙计!图像的扩张让我很开心! :)
    猜你喜欢
    • 2023-03-10
    • 2013-03-24
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2015-05-25
    • 2020-01-17
    相关资源
    最近更新 更多