当前位置: 首页 > news >正文

《深度学习》OpenCV轮廓检测 轮廓近似 解析及实现

目录

一、轮廓近似

1、什么是轮廓近似

2、参数解析

1)用法

2)参数

3)返回值

4)代码解析及实现

运行结果为:

二、总结

1、概念

2、轮廓近似的步骤:


一、轮廓近似

1、什么是轮廓近似

        指对轮廓进行逼近或拟合,得到近似的轮廓。在图像处理中,轮廓表示了图像中物体的边界,因此轮廓近似可以用来描述和识别物体的形状

2、参数解析

1)用法
import cv2
approx =cv2.approxPolyDP(curve,epsilon, closed)

2)参数

        • curve:表示要输入的轮廓

        • epsilon: 表示近似的精度,即两个轮廓之间最大欧氏距离,该参数越小,得到的近似结果越接近实际轮廓,反之得到的近似结果会更加粗糙

         • closed:表示布尔类型的参数,表示是否封闭轮廓,如果是True,表示输入的轮廓是封闭的,近似结果也会是封闭的,否则表示输入的轮廓不是封闭的,近似结果也不会封闭

3)返回值

        approx:表示近似结果,是一个ndarray数组,为一个近似后的轮廓,包含了被近似出来的轮上的点的坐标

4)代码解析及实现
import cv2
img = cv2.imread('phone.png')  # 导入原图
phone_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  # 原图转换为灰度图
ret,phone_thresh = cv2.threshold(phone_gray,100,25,cv2.THRESH_BINARY)  # 二值化,将大于100灰度值的像素更改为0,小于100像素值的更改为25
# 返回值ret为阈值,phone_thresh为二值化后的图像image, contours, hierarchy = cv2.findContours(phone_thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)  # 将二值化后的图像进行获取轮廓处理
# 轮廓检测方式为cv2.RETR_TREE,返回所有轮廓及完整层次结构,CV2.CHAIN_APPROX_NONE为存储所有的轮廓点epsilon = 0.001 * cv2.arcLength(contours[0],True)  # 设置近似值,计算轮廓为contours[0]的周长,参数true表示轮廓为封闭的,0.001表示精度,计算的结果越小,近似的精度越高
approx = cv2.approxPolyDP(contours[0],epsilon,True)  # 对轮廓进行近似,轮廓号为contours[0],近似的精度为epsilon,封闭轮廓
phone_new = img.copy()  # 对原图生成一个副本image_contours = cv2.drawContours(phone_new, [approx],contourIdx=-1,color=(0,255,0),thickness=3)  # 在副本图像上进行绘制轮廓,[approx]表示要回值得轮廓,contourIdx=-1表示绘制所有的轮廓
cv2.imshow('phone',img)   # 展示原图
cv2.waitKey(0)
cv2.imshow('image_contours',image_contours)   # 展示绘制轮廓的近似图像
cv2.waitKey(0)
运行结果为:

前者为原图,后者为在原图副本上进行绘制轮廓

二、总结

1、概念

        轮廓检测是指从图像中提取出对象的边界。它基于图像的边缘信息,通过对图像进行二值化处理,找到图像中的连通区域,然后提取出每个连通区域的边界轮廓。

        轮廓近似是指对提取出的轮廓进行简化,以减少轮廓点的数量。这在某些情况下很有用,比如当我们只关心轮廓的形状而不关心细节时,可以用较少的点来表示轮廓,从而减少计算量。

        OpenCV提供了多种轮廓近似的方法,包括Douglas-Peucker算法和Ramer-Douglas-Peucker算法。这些算法都是基于分治的思想,通过递归地将曲线分割为多个小段,并将每个小段用直线段来近似表示。

2、轮廓近似的步骤:

  1. 首先,需要通过轮廓检测得到对象的轮廓。
  2. 然后,使用OpenCV的approxPolyDP函数对轮廓进行近似。
  3. approxPolyDP函数需要传入多个参数,其中最重要的是epsilon参数,它控制了近似的精度。较大的epsilon值会得到较少的点,较小的epsilon值会得到更多的点。
  4. 最后,可以通过绘制轮廓的近似结果来观察近似的效果。

        总的来说,OpenCV的轮廓检测和轮廓近似功能可以帮助我们提取图像中对象的边界,并对边界进行简化表示。这对于图像分析、物体识别和计算机视觉任务等方面都非常有用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 代码随想录:377. 组合总和 Ⅳ
  • Nginx核心配置文件结构
  • 树莓派3B点灯(2)
  • 翻译器大分享,这5款你选哪款?
  • 鸿蒙(API 12 Beta6版)图形加速【Vulkan平台】超帧功能开发
  • Python游戏编程:用Python打造经典贪吃蛇小游戏
  • Kafka:浅谈对Kafka的认识
  • C#基础(5)交错数组*
  • Python | Leetcode Python题解之第390题消除游戏
  • IDEA加载工程报错Error Loading Project: Cannot load module demo.iml解决
  • 【Rust光年纪】Rust 机器人学库全景:功能、安装与API概览
  • 多个线程如何轮流输出1到100
  • GPU池化赋能智能制造
  • 原型模式prototype
  • C++ | Leetcode C++题解之第390题消除游戏
  • ERLANG 网工修炼笔记 ---- UDP
  • IP路由与转发
  • JavaScript 基本功--面试宝典
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MySQL用户中的%到底包不包括localhost?
  • Netty 4.1 源代码学习:线程模型
  • python3 使用 asyncio 代替线程
  • Ruby 2.x 源代码分析:扩展 概述
  • VUE es6技巧写法(持续更新中~~~)
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Webpack 4 学习01(基础配置)
  • 从0到1:PostCSS 插件开发最佳实践
  • 聊聊redis的数据结构的应用
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 人脸识别最新开发经验demo
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 什么是Javascript函数节流?
  • 正则表达式小结
  • Hibernate主键生成策略及选择
  • ​2021半年盘点,不想你错过的重磅新书
  • ​ArcGIS Pro 如何批量删除字段
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • (4)(4.6) Triducer
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Python第六天)文件处理
  • (ros//EnvironmentVariables)ros环境变量
  • (windows2012共享文件夹和防火墙设置
  • (补充)IDEA项目结构
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二十四)Flask之flask-session组件
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (论文阅读40-45)图像描述1
  • (算法)N皇后问题
  • (一一四)第九章编程练习
  • (转)程序员疫苗:代码注入
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET CORE 第一节 创建基本的 asp.net core