Moh*_*avi 2 python opencv python-2.7 scikit-image
我的图片在这里:

我正在寻找更好的解决方案或算法来检测这张照片中的椭圆部分(碟形),并在 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)))
Run Code Online (Sandbox Code Playgroud)
在由 skimage 制作Xie, Yonghong, and Qiang Ji并发布为...
“一种新的高效椭圆检测方法。” 模式识别,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()
Run Code Online (Sandbox Code Playgroud)
方法 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)
Run Code Online (Sandbox Code Playgroud)
这是我得到的:
方法 2:
在这种情况下,您也可以使用您建议的方法。椭圆/圆的霍夫检测。
您必须对图像进行预处理。我执行了自适应阈值并获得了这个:
现在您可以对该图像执行霍夫圆检测。
希望不是一口!!:D