python 基于opencv 绘制图像轮廓

作者:我坚信阳光灿烂 时间:2023-07-11 05:47:54 

图像轮廓概念

轮廓是一系列相连的点组成的曲线,代表了物体的基本外形。
谈起轮廓不免想到边缘,它们确实很像。简单的说,轮廓是连续的,边缘并不全都连续(下图)。其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手;而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓。

python 基于opencv 绘制图像轮廓

寻找轮廓的操作一般用于二值图像,所以通常会使用阈值分割或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)。

python 基于opencv 绘制图像轮廓

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 绘制图像轮廓

来源:https://www.cnblogs.com/wojianxin/p/12600958.html

标签:python,opencv,绘制,图像轮廓
0
投稿

猜你喜欢

  • python使用递归的方式建立二叉树

    2021-07-07 23:47:18
  • js+css实现有立体感的按钮式文字竖排菜单效果

    2024-04-22 13:09:42
  • np.newaxis()函数的具体使用

    2022-01-10 08:38:27
  • Django代码性能优化与Pycharm Profile使用详解

    2022-06-28 21:13:06
  • PHP高级编程实例:编写守护进程

    2023-10-27 02:03:22
  • 用css+js给网页背景插入flash播放器

    2007-10-21 09:27:00
  • node命令行服务器(http-server)和跨域的实现

    2021-03-10 05:00:09
  • python密码学对称和非对称密码教程

    2023-06-19 15:56:59
  • Python 使用with上下文实现计时功能

    2022-08-20 02:43:21
  • mysql中判断记录是否存在方法比较

    2024-01-27 05:14:49
  • 小程序登录/注册页面设计的实现代码

    2024-04-18 09:44:10
  • python实现Pyecharts实现动态地图(Map、Geo)

    2021-01-21 11:33:58
  • Python和Excel的完美结合的常用操作案例汇总

    2021-12-30 05:15:37
  • mysql数据库中字符集乱码问题原因及解决

    2024-01-14 19:38:10
  • python创建关联数组(字典)的方法

    2021-11-22 06:51:18
  • 深入SQL截取字符串(substring与patindex)的详解

    2024-01-27 16:16:24
  • JavaScript语法约定和程序调试原理解析

    2024-04-18 09:46:22
  • python检索特定内容的文本文件实例

    2022-12-29 12:05:42
  • Centos 7下使用RPM包安装MySQL 5.7.9教程

    2024-01-19 20:44:49
  • vue.js 动态组件详解

    2024-04-29 13:09:58
  • asp之家 网络编程 m.aspxhome.com