簡體   English   中英

opencv python中的橢圓檢測

[英]ellipse detection in opencv python

我的圖片在這里:

我的照片在這里。

我正在尋找更好的解決方案或算法來檢測這張照片中的橢圓部分(碟形),並在 Opencv 的另一張照片中將其遮蔽。 你能給我一些建議或解決方案嗎? 我的代碼是:

 circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1.2, 1, param1=128, minRadius=200, maxRadius=600)
    # draw detected circles on image
    circles = circles.tolist()
    for cir in circles:
        for x, y, r in cir:
            x, y, r = int(x), int(y), int(r)
            cv2.circle(img, (x, y), r, (0, 255, 0), 4)

    # show the output image
    cv2.imshow("output", cv2.resize(img, (500, 500)))

在謝永紅Xie, Yonghong, and Qiang Ji制作的 skimage 中有一個替代方案,並發表為...

“一種新的高效橢圓檢測方法。” 模式識別,2002 年。會議錄。 第 16 屆國際會議。 卷。 2. IEEE,2002。

他們的 Ellipse 檢測代碼相對較慢,示例大約需要 70 秒; 與網站聲稱的“28 秒”相比。

如果你有 conda 或 pip: "name" 安裝 scikit-image 並試一試......

他們的代碼可以在這里找到也可以復制/粘貼在下面:

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'})

ax1.set_title('Original picture')
ax1.imshow(image_rgb)

ax2.set_title('Edge (white) and result (red)')
ax2.imshow(edges)

plt.show()

方法 1:

正如 Miki 所建議的,我能夠使用輪廓屬性檢測給定圖像中的橢圓(在這里我使用了 area 屬性)。

代碼:

#--- First obtain the threshold using the greyscale image ---
ret,th = cv2.threshold(gray,127,255, 0)

#--- Find all the contours in the binary image ---
_, contours,hierarchy = cv2.findContours(th,2,1)
cnt = contours
big_contour = []
max = 0
for i in cnt:
   area = cv2.contourArea(i) #--- find the contour having biggest area ---
    if(area > max):
        max = area
        big_contour = i 

final = cv2.drawContours(img, big_contour, -1, (0,255,0), 3)
cv2.imshow('final', final)

這是我得到的:

在此處輸入圖片說明

方法 2:

在這種情況下,您也可以使用您建議的方法。 橢圓/圓的霍夫檢測。

您必須對圖像進行預處理。 我執行了自適應閾值並獲得了這個:

在此處輸入圖片說明

現在您可以對該圖像執行霍夫圓檢測。

希望不是一口!! :D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM