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

如何将图像色调统一为灰色并保留轮廓线?OpenCV技术咨询

保留填充后轮廓线的OpenCV实现方案

你当前的代码用cv2.fillPoly填充物体为灰色后,原轮廓被覆盖导致消失。只需在填充操作后,额外调用cv2.drawContours重新绘制轮廓即可解决问题。

修改后的完整代码

import cv2
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread("image.jpg")
# 转为灰度图并二值化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 提取轮廓
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 1. 填充物体为灰色(BGR格式,这里用中等灰色)
fill_color = (128, 128, 128)
cv2.fillPoly(img, [contours[1]], fill_color)

# 2. 重新绘制轮廓,选择与填充色有区分的颜色(比如深灰色)
contour_color = (80, 80, 80)
cv2.drawContours(img, [contours[1]], -1, contour_color, thickness=2)

# 转换为RGB格式后显示(OpenCV用BGR,matplotlib用RGB)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.show()

关键说明

  • 填充和绘制轮廓是两步独立操作:先填充内部区域,再在填充区域上方绘制轮廓线
  • 轮廓颜色要和填充色有明显区分,避免被覆盖。若需匹配参考图灰度,可直接调整fill_color和contour_color的数值
  • OpenCV颜色通道为BGR顺序,与matplotlib的RGB格式不同,显示前转换格式可避免颜色失真
  • thickness参数控制轮廓线粗细,需设为正数(设为-1会填充整个轮廓区域,不符合需求)

内容的提问来源于stack exchange,提问作者Howie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:55:30