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)))
-
skimage的另一种选择是由
Xie, Yonghong, and Qiang Ji
…“一种新的有效的椭圆检测方法。” 模式识别,2002年。会议记录。第16届国际会议。卷 2. IEEE,2002年。
他们的椭圆检测代码相对较慢,此示例大约需要70秒;相比网站声称“ 28秒”。
如果您有conda或pip:“名称”,请安装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-forced'}) ax1.set_title('Original picture') ax1.imshow(image_rgb) ax2.set_title('Edge (white) and result (red)') ax2.imshow(edges) plt.show()