如何将图像色调统一为灰色并保留轮廓线?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
相关产品推荐
相关产品推荐

