OpenCV:如何为检测到的相邻轮廓矩形添加统一外接大矩形
实现方案
你可以通过「先合并相邻矩形区域再重新找外接矩形」的思路实现,具体步骤和代码如下:
步骤说明
- 第一步:先过滤出所有符合面积要求的轮廓,把它们的外接矩形统一存到列表里
- 第二步:新建一个和原图尺寸一致的单通道空白掩膜,把所有上一步得到的小矩形都用白色填充画在掩膜上,位置相邻的矩形会自动合并成连通的大块区域
- 第三步:对这个掩膜重新做轮廓检测,得到的每一个轮廓对应的外接矩形,就是覆盖相邻小矩形的大外接矩形
- 第四步:把得到的大矩形画到原图上即可
代码示例
import cv2 import numpy as np # 原有逻辑,先拿到所有符合要求的小矩形 img = cv2.imread("你的原始图片路径") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) contours = cv2.findContours(gray.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) contours = contours[0] if len(contours) == 2 else contours[1] # 存储所有符合要求的小矩形 rect_list = [] for c in contours: area = cv2.contourArea(c) if area > 500: x,y,w,h = cv2.boundingRect(c) rect_list.append((x,y,w,h)) # 原有画小矩形和填充轮廓的逻辑可以保留 cv2.rectangle(img, (x, y), (x + w, y + h), (36,255,12), 2) cv2.drawContours(img, [c], 0, (0,255,0), -1) # 新建空白掩膜,合并相邻矩形 mask = np.zeros(img.shape[:2], dtype=np.uint8) for (x,y,w,h) in rect_list: # 把小矩形填充到掩膜,相邻的会自动连成片 cv2.rectangle(mask, (x,y), (x+w, y+h), 255, -1) # 对合并后的掩膜找轮廓,得到大矩形 merged_contours = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) merged_contours = merged_contours[0] if len(merged_contours) == 2 else merged_contours[1] for mc in merged_contours: mx,my,mw,mh = cv2.boundingRect(mc) # 画大外接矩形,颜色可自行调整 cv2.rectangle(img, (mx, my), (mx + mw, my + mh), (0,0,255), 3) # 展示/保存结果 cv2.imshow("result", img) cv2.waitKey(0)
可选优化
如果需要调整「相邻」的判断阈值,比如允许两个矩形间隔几个像素也算相邻,可以在画完掩膜之后加一步形态学膨胀操作:
# 3x3的卷积核,膨胀2个像素,间隔2像素以内的矩形都会被合并 kernel = np.ones((3,3), np.uint8) mask = cv2.dilate(mask, kernel, iterations=2)
调整迭代次数或者卷积核大小,就能灵活控制合并的宽松程度。
内容的提问来源于stack exchange,提问作者Sissi
相关产品推荐
相关产品推荐

