You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用OpenCV从射击靶图像中裁剪出最大圆形区域

求助:用OpenCV从射击靶图像中裁剪最大圆形区域的通用方案

各位好,我是图像识别新手,现在卡在一个射击靶图像处理的任务上了——我需要计算射击靶图像上的射击得分。之前试过用颜色分割识别弹孔,但因为弹孔的背景不一样,效果很差。现在打算换个思路:通过对比空靶和带弹孔靶的差异来识别弹孔,同时还要区分两种靶型,所以第一步必须先裁剪出靶的圆形区域,把背景干扰去掉。

试了好几种方法都没搞定,下面是我已经尝试过的方案和遇到的问题:

已尝试的方案及问题

1. HoughCircles检测最大圆形

我一开始想用cv2.HoughCircles找到靶的最外层圆形,之后把圆形外的区域去掉。调了好久参数,但总有一些示例图像要么识别不出最外层圆,要么干脆没结果。最后用的参数配置是这样的:

img = cv2.GaussianBlur(img, (3, 3), 0)
cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 2, 10000, param1=50, param2=100, minRadius=200, maxRadius=0)

感觉这个方法不太适配我的场景,就放弃了。

2. 颜色过滤提取最大轮廓

然后我试着通过过滤黑色范围来提取靶的轮廓,再找最大的轮廓。但图像里的阴影会把外层圆形破坏掉,导致轮廓不完整,根本没法完成裁剪。我的代码大概是这样的:

# black color boundaries [B, G, R]
lower = [0, 0, 0]
upper = [150, 150, 150]
# create NumPy arrays from the boundaries
lower = np.array(lower, dtype="uint8")
upper = np.array(upper, dtype="uint8")
# find the colors within the specified boundaries and apply the mask
mask = cv2.inRange(img, lower, upper)
output = cv2.bitwise_and(img, img, mask=mask)
ret, thresh = cv2.threshold(mask, 40, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
if len(contours) != 0:
    # draw in blue the contours that were founded
    cv2.drawContours(output, contours, -1, 255, 3)
    # find the biggest countour (c) by the area
    c = max(contours, key=cv2.contourArea)
    x, y, w, h = cv2.boundingRect(c)

之后还试了网上找的其他方案,都没效果,现在真心想请教大家有没有通用的解决方案建议。

内容的提问来源于stack exchange,提问作者JakubS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:53:01