OpenCV-Python中如何获取包含所有目标的单个最大外部轮廓?
解决方案
你当前代码是对每个独立轮廓分别计算凸包,所以得到多个小凸包。要获取包含所有目标的单个大轮廓,需要把所有轮廓的点合并后再计算整体凸包,具体实现如下:
修改后的代码
import cv2 as cv import numpy as np img_color = cv.imread('ex1.png') img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY) ret, img_binary = cv.threshold(img_gray, 127, 255, 0) _, contours, hierarchy = cv.findContours(img_binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # 合并所有轮廓的点到一个统一集合 all_points = np.vstack(contours) # 对合并后的点集计算整体凸包 hull = cv.convexHull(all_points) # 绘制最终的单个大轮廓 cv.drawContours(img_color, [hull], 0, (0, 0, 255), 5) cv.imwrite('save_image_final.png', img_color)
关键说明
np.vstack(contours)将所有检测到的轮廓点垂直堆叠成一个大数组,确保涵盖所有目标的像素位置信息。- 基于合并后的点集计算凸包,就能生成完全包围所有目标的单个外轮廓,匹配你需要的期望效果。
如果后续处理的图像存在噪声干扰,可先对二值图执行形态学膨胀操作,让分散的目标区域产生一定连接,但针对你提供的示例图,直接合并点集求凸包即可达到需求。
内容的提问来源于stack exchange,提问作者AJAMC
相关产品推荐
相关产品推荐

