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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 04:51:12