OpenCV调用drawContours绘制随机颜色轮廓时始终显示为白色问题求助
排查思路
- 第一步:验证目标图像的数据类型与取值范围
这是该类问题最高发的诱因,在绘制轮廓前插入代码打印图像属性:
如果输出为print(mosaic.dtype, mosaic.min(), mosaic.max())float32/float64类型,且最大值接近1:说明你的图像是01取值的浮点格式,你传入0255范围的颜色值时,所有大于1的数值都会被OpenCV截断为1,对应纯白色。解决方案是将随机颜色生成逻辑改为输出0~1范围的浮点值即可:
如果输出为color = np.random.rand(3).tolist()uint8类型,最大值为255,可排除该类问题,继续后续排查。 - 第二步:排查轮廓重叠问题
如果contours中存在大量完全重叠的轮廓,多层不同颜色叠加后视觉效果会接近白色。你可以临时修改代码仅绘制单个轮廓验证:
此时如果颜色显示正常,说明是轮廓重叠导致的问题,你需要提前对轮廓做去重、过滤小轮廓的预处理。# 仅绘制第一个轮廓测试 c = contours[0] color = list(np.random.rand(3)*255) color = [int(x) for x in color] cv2.drawContours(mosaic, [c], 0, color, 3) - 第三步:排除后续处理逻辑的干扰
你可以在drawContours执行后立刻调用cv2.imwrite("test.png", mosaic)保存图像到本地,直接查看保存结果,排除后续归一化、直方图均衡、显示工具像素值映射等步骤导致的颜色异常。 - 第四步:替换随机颜色生成逻辑
避免手动类型转换可能存在的隐式问题,直接用numpy的随机整数接口生成符合要求的颜色值:color = np.random.randint(0, 256, size=3, dtype=np.uint8).tolist()
内容的提问来源于stack exchange,提问作者hellvetica
相关产品推荐
相关产品推荐

