opencv中灰度图绘制轮廓无法显示轮廓颜色的问题

本文讲述了在使用OpenCV处理图像时遇到的一个问题:尝试在二值化图像上绘制彩色轮廓,但未能成功显示颜色。通过分析发现,灰度图和二值化图只有一个通道,无法直接显示颜色。解决方案是将三个相同的灰度图通道合并,从而在合并后的图像上正确绘制彩色轮廓。作者通过这个过程学习到了关于灰度图和图像通道的知识,并分享了解决问题的过程。
摘要由CSDN通过智能技术生成

不多废话,我们直入主题 XD

下面是一段代码:

import cv2

img=cv2.imread('55.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#转换为灰度图

ret,thresh =cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#二值化灰度图

contours,binary=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#获得轮廓

draw_img=img.copy()

res=cv2.drawContours(draw_img,contours,-1,(0,0,255),1)
#绘制轮廓

cv2.imshow('res',res)



我们将原图拷贝了一份,并将轮廓绘制到副本上,得到了如下图像:


在这里插入图片描述
图片来自知乎顾与盼
感谢这张图片陪我走完了学习opencv的这一段时光



我一直用它做例子来着


可以看到,我在原图的副本上画出了红色的边缘轮廓。
事后我突发奇想,可不可以在二值化(或灰度图)的图像上画出红色的轮廓呢?

import cv2

img=cv2.imread('55.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#转换为灰度图

ret,thresh =cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#二值化灰度图

contours,binary=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#获得轮廓

draw_img=img.copy()

res=cv2.drawContours(thresh,contours,-1,(0,0,255),1)
#绘制轮廓

cv2.imshow('res',res)

为了方便展示效果,将线条粗细调整为5


结果却出人意料,图片上的边缘轮廓未能正确的显示颜色!
(这背后一定有鬼!)


顺便提一下,灰度图也无法显示颜色,别试了(哭)

在这里插入图片描述
经过分析,我认为,是边缘轮廓也被进行了处理,所以才无法显示颜色。
为什么会这样????


直到我看到了百度对灰度图的完整解释:

什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,而灰度图只有一个通道,他有256个灰度等级,255代表全白,0表示全黑。在Windows操作系统中可以使用画图的颜色编辑功能,将红绿蓝三个通道的数值设定为相同值就可以看到其对应的灰度效果。

注意 “灰度图只有一个通道”



我们平常的图像为RGB三通道,而灰度图本身为单通道,自然不会正确的显示边缘轮廓的颜色,所以要将三幅灰度图叠在一起:


举个栗子

draw_img=cv2.merge((thresh.copy(),thresh.copy(),thresh.copy()))



完整代码:

import cv2

img=cv2.imread('55.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#转换为灰度图

ret,thresh =cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
#二值化灰度图

contours,binary=cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
#获得轮廓

draw_img=cv2.merge((thresh.copy(),thresh.copy(),thresh.copy()))
#叠加
res=cv2.drawContours(draw_img,contours,-1,(255,0,255),1)
#绘制轮廓


cv2.imshow('res',res)

在这里插入图片描述
自己好傻啊,这问题这么简单却困扰我这么久


恐怕这就是学习吧……

  • 32
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值