不多废话,我们直入主题 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)
自己好傻啊,这问题这么简单却困扰我这么久
恐怕这就是学习吧……