ellipse detection in opencv python

后端 未结 2 2074
感动是毒
感动是毒 2021-01-07 00:51

My image is here:

\"my

i\'m looking for a better solution or algorithm to detect the

2条回答
  •  广开言路
    2021-01-07 01:21

    There is an alternative for it in skimage made by Xie, Yonghong, and Qiang Ji and published as...

    “A new efficient ellipse detection method.” Pattern Recognition, 2002. Proceedings. 16th International Conference on. Vol. 2. IEEE, 2002.

    Their Ellipse detection code is relatively slow and the example takes about 70 seconds; compared to website claimed "28 seconds".

    If you have conda or pip: "name" install scikit-image and give it a shot...

    Their code can be found here or as copy/pasted below:

    import matplotlib.pyplot as plt
    
    from skimage import data, color, img_as_ubyte
    from skimage.feature import canny
    from skimage.transform import hough_ellipse
    from skimage.draw import ellipse_perimeter
    
    # Load picture, convert to grayscale and detect edges
    image_rgb = data.coffee()[0:220, 160:420]
    image_gray = color.rgb2gray(image_rgb)
    edges = canny(image_gray, sigma=2.0,
                  low_threshold=0.55, high_threshold=0.8)
    
    # Perform a Hough Transform
    # The accuracy corresponds to the bin size of a major axis.
    # The value is chosen in order to get a single high accumulator.
    # The threshold eliminates low accumulators
    result = hough_ellipse(edges, accuracy=20, threshold=250,
                           min_size=100, max_size=120)
    result.sort(order='accumulator')
    
    # Estimated parameters for the ellipse
    best = list(result[-1])
    yc, xc, a, b = [int(round(x)) for x in best[1:5]]
    orientation = best[5]
    
    # Draw the ellipse on the original image
    cy, cx = ellipse_perimeter(yc, xc, a, b, orientation)
    image_rgb[cy, cx] = (0, 0, 255)
    # Draw the edge (white) and the resulting ellipse (red)
    edges = color.gray2rgb(img_as_ubyte(edges))
    edges[cy, cx] = (250, 0, 0)
    
    fig2, (ax1, ax2) = plt.subplots(ncols=2, nrows=1, figsize=(8, 4), sharex=True,
                                    sharey=True,
                                    subplot_kw={'adjustable':'box-forced'})
    
    ax1.set_title('Original picture')
    ax1.imshow(image_rgb)
    
    ax2.set_title('Edge (white) and result (red)')
    ax2.imshow(edges)
    
    plt.show()
    

提交回复
热议问题