如何用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
相关产品推荐
相关产品推荐

