python 基于opencv 绘制图像轮廓
程序员文章站
2022-06-17 16:00:47
图像轮廓概念轮廓是一系列相连的点组成的曲线,代表了物体的基本外形。谈起轮廓不免想到边缘,它们确实很像。简单的说,轮廓是连续的,边缘并不全都连续(下图)。其实边缘主要是作为图像的特征使用,比如可以用边缘...
图像轮廓概念
轮廓是一系列相连的点组成的曲线,代表了物体的基本外形。
谈起轮廓不免想到边缘,它们确实很像。简单的说,轮廓是连续的,边缘并不全都连续(下图)。其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手;而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓。
寻找轮廓的操作一般用于二值图像,所以通常会使用阈值分割或canny边缘检测先得到二值图。
注意:寻找轮廓是针对白色物体的,一定要保证物体是白色,而背景是黑色,不然很多人在寻找轮廓时会找到图片最外面的一个框。
opencv找出图像轮廓
使用cv.findcontours()寻找轮廓:
import cv2 as cv import numpy as np img = cv.imread('j.png') img_gray = cv.cvtcolor(img, cv.color_bgr2gray) ret, thresh = cv.threshold(img_gray, 0, 255, cv.thresh_binary_inv + cv.thresh_otsu) # 寻找二值图像的轮廓 contours, hierarchy = cv.findcontours( thresh, cv.retr_tree, cv.chain_approx_simple) print(len(contours))
- 参数2:轮廓的查找方式,一般使用cv.retr_tree,表示提取所有的轮廓并建立轮廓间的层级。
- 参数3:轮廓的近似方法。比如对于一条直线,我们可以存储该直线的所有像素点,也可以只存储起点和终点。使用cv.chain_approx_simple就表示用尽可能少的像素点表示轮廓。
- 简便起见,这两个参数也可以直接用真值3和2表示。
- 函数有2个返回值,hierarchy是轮廓间的层级关系,这个不用理会。我们主要看contours,它就是找到的轮廓了,以链表形式存储,记录了每条轮廓的所有像素点的坐标(x,y)。
opencv绘制图像轮廓
轮廓找出来后,可以像图中那样用红色画出来:cv.drawcontours()
cv.drawcontours(img, contours, -1, (0, 0, 255), 2)
其中参数2就是得到的contours,参数3表示要绘制哪一条轮廓,-1表示绘制所有轮廓,参数4是颜色(b/g/r通道,所以(0,0,255)表示红色),参数5是线宽。
经验之谈:很多人画图时明明用了彩色,但没有效果,请检查你是在哪个图上画,画在灰度图和二值图上显然是没有彩色的。
一般情况下,我们会首先获得要操作的轮廓,再进行轮廓绘制及分析:
cnt = contours[1]
cv.drawcontours(img, [cnt], 0, (0, 0, 255), 2)
实验:找出并绘制图像轮廓
import cv2 as cv import numpy as np img = cv.imread('jiao.jpg') img_gray = cv.cvtcolor(img, cv.color_bgr2gray) ret, thresh = cv.threshold(img_gray, 0, 255, cv.thresh_binary_inv + cv.thresh_otsu) # 寻找二值图像的轮廓 contours, hierarchy = cv.findcontours( thresh, cv.retr_tree, cv.chain_approx_simple) cnt = contours[1:6] cv.drawcontours(img, cnt, -1, (0, 0, 255), 2) cv.imshow('result',img) cv.waitkey(0) cv.destroyallwindows()
实验结果
以上就是python 基于opencv 绘制图像轮廓的详细内容,更多关于python 绘制图像轮廓的资料请关注其它相关文章!
上一篇: Jinja2模块简介
下一篇: Jinja2