Python中用drawContours绘制最大轮廓返回空白图的问题
问题解决:提取并绘制最大轮廓得到空白图像的修复方案
问题原因
你的代码直接使用灰度图提取轮廓,但cv2.findContours需要基于二值图像(仅包含黑色和白色像素)才能有效识别轮廓。原始灰度图中目标与背景的灰度差不够明显,导致无法提取到有效轮廓,最终绘制出空白图像。
修改后的代码
import cv2 import numpy as np # 读取图像 img_1 = cv2.imread('img.png') if img_1 is None: print("图像读取失败,请检查文件路径") exit() # 转灰度图 img_gray = cv2.cvtColor(img_1, cv2.COLOR_BGR2GRAY) # 关键步骤:二值化处理(使用Otsu自动阈值,自动区分目标和背景) _, img_binary = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 获取外部轮廓 cnts = cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if len(cnts) == 2 else cnts[1] # 处理无轮廓的情况 if not cnts: print("未检测到轮廓") exit() # 筛选最大面积的轮廓 maxcontour = max(cnts, key=cv2.contourArea) # 在黑色背景上绘制白色填充轮廓 contour = np.zeros(img_1.shape, dtype=np.uint8) mask1 = cv2.drawContours(contour, [maxcontour], 0, 255, -1) # 显示结果 cv2.imshow('最大轮廓掩码', mask1) cv2.waitKey(0) cv2.destroyAllWindows()
关键修改点说明
- 添加二值化处理:使用
cv2.threshold结合Otsu自动阈值,将灰度图转换为黑白二值图,确保目标轮廓与背景清晰分离。THRESH_BINARY_INV是因为原始图像中目标是深色、背景是浅色,反转后目标为白色,符合轮廓提取的要求。 - 添加图像读取失败的判断:避免因路径错误导致后续代码报错。
- 添加无轮廓的异常处理:防止
max()函数因空列表报错。 - 完善显示逻辑:添加
cv2.waitKey()和cv2.destroyAllWindows(),确保窗口能正常显示并关闭。
内容的提问来源于stack exchange,提问作者Lala
相关产品推荐
相关产品推荐

