Python机器视觉--OpenCV进阶(核心)--图像轮廓查找识别,绘制图像轮廓与图像轮廓的面积周长计算
1.图像轮廓查找识别与绘制图像轮廓
1.1 什么是图像轮廓
图像轮廓是具有相同颜色或灰度的连续点的曲线. 轮廓在形状分析和物体的检测和识别中很有用。
轮廓的作用:
- 用于图形分析
- 物体的识别和检测
注意点:
- 为了检测的准确性,需要先对图像进行二值化或Canny操作。
- 画轮廓时会修改输入的图像, 如果之后想继续使用原始图像,应该将原始图像储存到其他变量中。
1.2 图像轮廓的查找
findContours(image, mode, method[, contours[, hierarchy[, offset]]])
mode 查找轮廓的模式
- RETR_EXTERNAL = 0, 表示只检测外围轮廓
- RETR_LIST = 1, 检测的轮廓不建立等级关系, 即检测所有轮廓, 较为常用
- RETR_CCOMP = 2, 每层最多两级, 从小到大, 从里到外.
- RETR_TREE = 3, 按照树型存储轮廓, 从大到小, 从右到左.
- RETR_EXTERNAL = 0, 表示只检测外围轮廓
method 轮廓近似方法也叫ApproximationMode
- CHAIN_APPROX_NONE 保存所有轮廓上的点
- CHAIN_APPROX_SIMPLE, 只保存角点, 比如四边形, 只保留四边形的4个角, 存储信息少, 比较常用
返回 contours和hierachy 即轮廓和层级
代码实现
import cv2
import numpy as np# 该图像显示效果是黑白的, 但是实际上却是3个通道的彩色图像.
img = cv2.imread('./contours1.jpeg')# 变成单通道的黑白图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化, 注意有2个返回值, 阈值和结果
ret, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)# cv2.imshow('img', img)
# cv2.imshow('binary', binary)# 轮廓查找, 新版本返回两个结果, 轮廓和层级, 老版本返回3个参数, 图像, 轮廓和层级
result, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 打印轮廓
print(contours)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.3 图像轮廓的绘制
drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])
- image 要绘制的轮廓图像
- contours轮廓点
- contourIdx 要绘制的轮廓的编号. -1 表示绘制所有轮廓
- color 轮廓的颜色, 如 (0, 0, 255)表示红色
- thickness线宽, -1 表示全部填充
代码实现
import cv2
import numpy as np# 该图像显示效果是黑白的, 但是实际上却是3个通道的彩色图像.
img = cv2.imread('./contours1.jpeg')# 变成单通道的黑白图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化, 注意有2个返回值, 阈值和结果
ret, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)# 轮廓查找, 新版本返回两个结果, 轮廓和层级, 老版本返回3个参数, 图像, 轮廓和层级
result, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓, 注意, 绘制轮廓会改变原图
cv2.drawContours(img, contours, 1, (0, 0, 255), 2)cv2.imshow('img', img)cv2.waitKey(0)
cv2.destroyAllWindows()
效果如图
1.4轮廓的面积和周长的计算
轮廓面积是指每个轮廓中所有的像素点围成区域的面积,单位为像素。
轮廓面积是轮廓重要的统计特性之一,通过轮廓面积的大小可以进一步分析每个轮廓隐含的信息,例如通过轮廓面积区分物体大小识别不同的物体。
在查找到轮廓后, 可能会有很多细小的轮廓, 我们可以通过轮廓的面积进行过滤.
- contourArea(contour)
- arcLength(curve, closed)
- curve即轮廓
- closed是否是闭合的轮廓
代码实现
import cv2
import numpy as np# 该图像显示效果是黑白的, 但是实际上却是3个通道的彩色图像.
img = cv2.imread('./contours1.jpeg')# 变成单通道的黑白图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化, 注意有2个返回值, 阈值和结果
ret, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)# 轮廓查找, 新版本返回两个结果, 轮廓和层级, 老版本返回3个参数, 图像, 轮廓和层级
result, contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓, 注意, 绘制轮廓会改变原图
cv2.drawContours(img, contours, 1, (0, 0, 255), 2)# 计算面积
area = cv2.contourArea(contours[1])
print('area: ', area)
cv2.imshow('img', img)# 计算周长
perimeter = cv2.arcLength(contours[1], True)
print('perimeter:', perimeter)cv2.waitKey(0)
cv2.destroyAllWindows()
Python机器视觉--OpenCV进阶(核心)--图像轮廓查找识别,绘制图像轮廓与图像轮廓的面积周长计算相关推荐
- Python机器视觉--OpenCV进阶(核心)--常用低通滤波器(方盒滤波器,均值滤波器,高斯滤波器,中值滤波器,双边滤波器)
1.常用低通滤波器介绍 1.1低通滤波器与高通滤波器的区别: 1.低通滤波主要用于噪点的消除或者是用于图像的降噪 2.高通滤波器主要于图像边缘的寻找 1.2 方盒滤波 boxFilter(src, d ...
- python使用opencv查找轮廓_(八)OpenCV-Python学习—轮廓查找,绘制和拟合
针对物体轮廓,opencv还提供了一些相关的函数,来处理轮廓查找,绘制,拟合,以及计算轮廓周长和面积等,详细介绍如下: 1. 寻找和绘制轮廓 opencv的findContours()能寻找图片中的轮 ...
- python利用opencv自带的颜色查找表(LUT)进行色彩风格变换
1 LUT颜色查找表介绍 Look Up Table(LUT)查找表 1.颜色查找表就是一种像素值映射的表,如下是一个对比度改变图像的查找表,从图中可以知道: 原图中像素值为40的像素,经过查找表映射 ...
- Python爬虫新手进阶版:怎样读取非结构化网页、图像、视频、语音数据
导读:常见的数据来源和获取方式,你或许已经了解很多.本文将拓展数据来源方式和格式的获取,主要集中在非结构化的网页.图像.视频和语音. 01 从网页中爬取运营数据 要从网页中爬虫数据,可使用Python ...
- OpenCV进阶之路:神经网络识别车牌字符
1. 关于OpenCV进阶之路 前段时间写过一些关于OpenCV基础知识方面的系列文章,主要内容是面向OpenCV初学者,介绍OpenCV中一些常用的函数的接口和调用方法,相关的内容在OpenCV的手 ...
- 轮廓查找、绘制以及轮廓长度计算
有时需要对已有的图像进行处理,使其更清晰或更规则,轮廓检测可以达到这个目的.先介绍几个相关函数: 1.findContours函数 findContours( InputOutputArray ima ...
- 毛星云opencv之8.4.4查找和绘制图像轮廓矩
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #i ...
- opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形
一.简介 二.外接矩形的查找绘制 1 #include "opencv2/opencv.hpp" 2 using namespace cv; 3 void main() 4 { 5 ...
- Opencv——查找并绘制凸包、凸包与轮廓的关系
定义 给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型. 理解物体形状或轮廓的一 种比较有用的方法便是计算一个物体的凸包,然后计算其凸缺陷(convexity defects). 检测 ...
最新文章
- 诺奖得主涉嫌学术不端!30余篇论文被指涉嫌P图造假、复制粘贴,合作者包括中国学者...
- XGBoost相关知识-2
- 光猫直连电脑不能上网_电脑插上网线不能上网怎么办
- 体育馆黑名单系统 的设定
- php中如何调用datepicker,如何使用datepicker,ajax,php,mysql在两个日期之间生成报告?...
- 达摩院 AI 进入中国科技馆,首张 AI 识别新冠 CT 成科技抗疫历史见证
- (一)boost库之日期、时间
- 图书馆可以借到的书目
- android 中Dialog对话框及自定义Dialog的方法
- linux之自己总结学习linux的资源推荐
- 亿佰特物联网开关电源模块:压电发声器驱动器
- 啊哈java_1.桶排序——啊哈算法java实现
- Hexo next博客添加折叠块功能添加折叠代码块
- excel 第六次人口普查_第六次全国人口普查表短表(标准版)
- CentOS 6虚拟机Hadoop安装教程
- python snownlp_snownlp · PyPI
- 华为光猫上线流程、注册失败、常见语音故障处理
- Element表格数据居中
- 使用fastjson字符串对象互转
- html中如何实现a标签的点击事件
热门文章
- Python初学习--你的历史我想知道一下
- SpringBoot项目拥抱Mybatis-Plus持久层框架实践
- 一个简陋的文字计数器
- 增量打包工具:patch-generator-desk
- SpringBoot 执行测试类取消控台台日志输出,配置只显示测试记录
- dell-precision-7730笔记本工作站安装centos7操作系统办法
- 用C语言编程,根据用户输入的半径计算球的表面积,体积,经过圆心的横切圆的面积以及以此球的半径、直径作为直径和高的圆柱体的侧面积、表面积和体积(将π定义成值为3.14的符号常量)
- 云贝餐饮o2o最新开源
- java html 转 jpg cobra,Cobra
- 实用流量数据分析指南