目录

简述

1. 什么是图像轮廓?

2. 查找图像轮廓

2.1 接口定义

2.2 参数说明

 2.3 代码示例

2.4 运行结果

3. 绘制图像轮廓

3.1 接口定义

3.2 参数说明

3.3 代码示例

 3.4 运行结果

4. 计算轮廓周长

5. 计算轮廓面积

6. 示例:计算图像轮廓的面积与周长

7. 应用场景


相关阅读

OpenCV:多边形逼近与凸包-CSDN博客


简述

在图像处理领域,轮廓是图像中物体的边界或形状信息的表达方式。通过提取轮廓,可以对图像中的目标进行识别、测量和分析。本文将从概念到实际操作详细介绍图像轮廓及其相关操作,并展示如何在 OpenCV 中实现。


1. 什么是图像轮廓?

图像轮廓 是图像中物体边界的闭合曲线,表示具有相同强度或颜色像素的连接路径。它是一种重要的图像特征,常用于形状分析和对象检测。

特点

  • 轮廓基于二值图像计算,必须先将输入图像转换为二值图。
  • OpenCV 提供的轮廓查找算法将视图像中的白色区域为前景(目标)。
  • 轮廓的方向可以是顺时针或逆时针。

2. 查找图像轮廓

OpenCV 提供了 cv2.findContours() 函数来查找图像的轮廓。

2.1 接口定义

contours, hierarchy = cv2.findContours(image, mode, method)

2.2 参数说明

image:输入的二值图像(通常是灰度图的阈值化结果)。
mode:轮廓的检索模式,常见值:

  • cv2.RETR_EXTERNAL:只检测最外层轮廓。
  • cv2.RETR_LIST:检测所有轮廓,不建立层级关系。
  • cv2.RETR_TREE:检测所有轮廓,并构建完整层级关系。

method:轮廓的近似方法:

  • cv2.CHAIN_APPROX_NONE:存储所有的轮廓点。
  • cv2.CHAIN_APPROX_SIMPLE:只存储必要的轮廓点,压缩水平和垂直冗余点。

返回值:

  • contours:检测到的轮廓列表,每个轮廓是一个 Numpy 数组。
  • hierarchy:每个轮廓的层级关系。

 2.3 代码示例

import cv2# 读取图像并转为灰度图
image = cv2.imread('D:\\resource\\filter\\find_contours.png', cv2.IMREAD_GRAYSCALE)# 二值化
_, binary_img = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY)# 轮廓查找
#contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(contours)# 显示图像 
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例说明:

  • 当前示例使用的图像为:白色背景,中间画了一个黑色的矩形。
  • 用win11自带的画图软件画出来的,并非纯粹的黑白图像,在代码中最好进行二值化处理
  • 该示例的作用是将图像中所有轮廓的必要点打印出来。

2.4 运行结果

 

打印结果显示的是:图像必要的轮廓点。

该图像包含2个轮廓 :

  • 最外层的白色背景边框。
  • 中间黑色矩形边框。

3. 绘制图像轮廓

OpenCV 提供了 cv2.drawContours() 函数用于绘制轮廓。

3.1 接口定义

cv2.drawContours(image, contours, contourIdx, color, thickness)

3.2 参数说明

image:目标图像,轮廓将绘制在此图像上。
contours:轮廓数据,cv2.findContours() 的输出。
contourIdx:指定绘制的轮廓索引:

  • -1:绘制所有轮廓。
  • >=0:绘制特定索引的轮廓。

color:绘制轮廓的颜色(BGR 格式)。
thickness:线条粗细,-1 表示填充轮廓。

3.3 代码示例

import cv2# 读取图像
image = cv2.imread('D:\\resource\\filter\\find_contours.png')# 转为灰度图
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化
_, binary_img = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY)# 轮廓查找
contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
result = cv2.drawContours(image, contours, -1, (0,0,255), 2)# 显示图像 
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例说明:

  • 依旧使用同一张图片。
  • 该示例的作用是将图像中所有的轮廓用红色的线条绘制出来,其中线条的粗细数值为2。 

 3.4 运行结果

将图像中所有的轮廓绘制出来:


    4. 计算轮廓周长

    OpenCV 提供了 cv2.arcLength() 函数计算轮廓的周长。

    接口定义

    perimeter = cv2.arcLength(curve, closed)

    参数说明

    • curve:输入轮廓点。
    • closed:布尔值,是否将轮廓视为闭合曲线。

    返回值

    轮廓的周长(浮点数)。


    5. 计算轮廓面积

    OpenCV 提供了 cv2.contourArea() 函数计算轮廓的面积。

    接口定义:

    area = cv2.contourArea(contour)
    

    参数说明:

    • contour:输入轮廓点。

    返回值

    轮廓的面积(浮点数)。


    6. 示例:计算图像轮廓的面积与周长

    示例如下: 

    import cv2# 读取图像
    image = cv2.imread('D:\\resource\\filter\\find_contours.png')# 转为灰度图
    gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化
    _, binary_img = cv2.threshold(gray_img, 150, 255, cv2.THRESH_BINARY)# 轮廓查找
    #contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    contours, hierarchy = cv2.findContours(binary_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    # print(contours)# 绘制轮廓
    #result = cv2.drawContours(image, contours, -1, (0,0,255), 2)# 计算面积
    area = cv2.contourArea(contours[1])
    print("area=%d"%(area))# 计算周长
    len = cv2.arcLength(contours[1], True)
    print("len=%d"%(len))# 显示图像 
    #cv2.imshow('image', image)
    #cv2.imshow('result', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    示例说明:

    • 依旧使用同一张图像。
    • 查找图像轮廓,取索引为1的轮廓。
    • 计算其面积与周长,并打印出来。

     打印输出:

    PS D:\code\opencv_python> & "D:/Program Files/Python38-32/python.exe" d:/code/opencv_python/calc_contours.py
    area=35951
    len=769
    PS D:\code\opencv_python>

    7. 应用场景

    1. 目标检测与识别:通过轮廓提取图像中的特定对象。
    2. 形状分析:计算周长、面积等几何属性。
    3. 物体测量:用于测量物体的尺寸和外观特征。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如若转载,请注明出处:http://www.pswp.cn/web/67999.shtml
    繁体地址,请注明出处:http://hk.pswp.cn/web/67999.shtml
    英文地址,请注明出处:http://en.pswp.cn/web/67999.shtml

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    在Mac mini M4上部署DeepSeek R1本地大模型

    在Mac mini M4上部署DeepSeek R1本地大模型 安装ollama 本地部署,我们可以通过Ollama来进行安装 Ollama 官方版:【点击前往】 Web UI 控制端【点击安装】 如何在MacOS上更换Ollama的模型位置 默认安装时,OLLAMA_MODELS 位置在"~/.o…

    CVPR | CNN融合注意力机制,芜湖起飞!

    **标题:**On the Integration of Self-Attention and Convolution **论文链接:**https://arxiv.org/pdf/2111.14556 **代码链接:**https://github.com/LeapLabTHU/ACmix 创新点 1. 揭示卷积和自注意力的内在联系 文章通过重新分解卷积和自…

    module ‘matplotlib.cm‘ has no attribute ‘get_cmap‘

    目录 解决方法1: 解决方法2,新版api改了: module matplotlib.cm has no attribute get_cmap 报错代码: cmap matplotlib.cm.get_cmap(Oranges) 解决方法1: pip install matplotlib3.7.3 解决方法2,新版…

    使用Nuxt.js实现服务端渲染(SSR):提升SEO与性能的完整指南

    使用Nuxt.js实现服务端渲染(SSR):提升SEO与性能的完整指南 使用Nuxt.js实现服务端渲染(SSR):提升SEO与性能的完整指南1. 服务端渲染(SSR)核心概念1.1 CSR vs SSR vs SSG1.2 SSR工作原…

    解释 Java 中的反射机制和动态代理的原理?

    反射机制是Java语言的一个特性,它允许程序在运行时检查和操作类、方法、字段等。 通过反射,我们可以在运行时获取类的信息,创建对象,调用方法和访问字段,即使这些信息在编译时是未知的。 反射的基本用法 import jav…

    http状态码:504 Gateway Timeout(网关超时)的原有以及排查问题的思路

    504 Gateway Timeout(网关超时) 是一种常见的HTTP错误状态码,表示服务器作为网关或代理时,未能及时从上游服务器收到响应。以下是它的原因和排查问题的思路: 1. 504错误的含义 定义:服务器作为网关或代理时…

    Linux 安装 RabbitMQ

    Linux下安装RabbitMQ 1 、获取安装包 # 地址 https://github.com/rabbitmq/erlang-rpm/releases/download/v21.3.8.9/erlang-21.3.8.9-1.el7.x86_64.rpm erlang-21.3.8.9-1.el7.x86_64.rpmsocat-1.7.3.2-1.el6.lux.x86_64.rpm# 地址 https://github.com/rabbitmq/rabbitmq-se…

    LOCAL_PREBUILT_JNI_LIBS使用说明

    LOCAL_PREBUILT_JNI_LIBS使用说明 使用LOCAL_PREBUILT_JNI_LIBS,可用于控制APK集成时,其相关so的集成方式。 比如,用于将APK中的so,抽取出来。 LOCAL_PREBUILT_JNI_LIBS : \lib/arm64-v8a/libNativeCore.so \lib/arm64-v8a/liba…

    Java中的object类

    1.Object类是什么? 🟪Object 是 Java 类库中的一个特殊类,也是所有类的父类(超类),位于类继承层次结构的顶端。也就是说,Java 允许把任何类型的对象赋给 Object 类型的变量。 🟦Java里面除了Object类,所有的…

    uniapp小程序自定义中间凸起样式底部tabbar

    我自己写的自定义的tabbar效果图 废话少说咱们直接上代码,一步一步来 第一步: 找到根目录下的 pages.json 文件,在 tabBar 中把 custom 设置为 true,默认值是 false。list 中设置自定义的相关信息, pagePath&#x…

    四、GPIO中断实现按键功能

    4.1 GPIO简介 输入输出(I/O)是一个非常重要的概念。I/O泛指所有类型的输入输出端口,包括单向的端口如逻辑门电路的输入输出管脚和双向的GPIO端口。而GPIO(General-Purpose Input/Output)则是一个常见的术语&#xff0c…

    vscode+CMake+Debug实现 及权限不足等诸多问题汇总

    环境说明 有空再补充 直接贴两个json tasks.json {"version": "2.0.0","tasks": [{"label": "cmake","type": "shell","command": "cmake","args": ["../"…

    【Elasticsearch】post_filter

    post_filter是 Elasticsearch 中的一种后置过滤机制,用于在查询执行完成后对结果进行过滤。以下是关于post_filter的详细介绍: 工作原理 • 查询后过滤:post_filter在查询执行完毕后对返回的文档集进行过滤。这意味着所有与查询匹配的文档都…

    《数据可视化新高度:Graphy的AI协作变革》

    在数据洪流奔涌的时代,企业面临的挑战不再仅仅是数据的收集,更在于如何高效地将数据转化为洞察,助力决策。Graphy作为一款前沿的数据可视化工具,凭借AI赋能的团队协作功能,为企业打开了数据协作新局面,重新…

    Vue 2 与 Vue 3 的主要区别

    Vue.js 是一个流行的前端框架,用于构建用户界面和单页应用。自从 Vue 2 发布以来,社区对其进行了广泛的应用和扩展,而 Vue 3 的发布则带来了许多重要的改进和新特性。 性能提升 Vue 3 在响应式系统上进行了重大的改进,采用了基于…

    从零开始:用Qt开发一个功能强大的文本编辑器——WPS项目全解析

    文章目录 引言项目功能介绍1. **文件操作**2. **文本编辑功能**3. **撤销与重做**4. **剪切、复制与粘贴**5. **文本查找与替换**6. **打印功能**7. **打印预览**8. **设置字体颜色**9. **设置字号**10. **设置字体**11. **左对齐**12. **右对齐**13. **居中对齐**14. **两侧对…

    【IoCDI】_Spring的基本扫描机制

    目录 1. 创建测试项目 2. 改变启动类所属包 3. 使用ComponentScan 4. Spring基本扫描机制 程序通过注解告诉Spring希望哪些bean被管理,但在仅使用Bean时已经发现,Spring需要根据五大类注解才能进一步扫描方法注解。 由此可见,Spring对注…

    vue 引入百度地图和高德天气 都得获取权限

    vue接入百度地图---获取ak https://blog.csdn.net/qq_57144407/article/details/143430661 vue接入高德天气, 需要授权----获取key https://www.jianshu.com/p/09ddd698eebe

    通向AGI之路:人工通用智能的技术演进与人类未来

    文章目录 引言:当机器开始思考一、AGI的本质定义与技术演进1.1 从专用到通用:智能形态的范式转移1.2 AGI发展路线图二、突破AGI的五大技术路径2.1 神经符号整合(Neuro-Symbolic AI)2.2 世界模型架构(World Models)2.3 具身认知理论(Embodied Cognition)三、AGI安全:价…

    python中的命名规范

    在python中,命名规范是编写清晰,可读性强代码的重要部分,遵循这些规范可以使代码更易于理解和维护。 Type命名约定命名例子函数(Function)小写单词,下划线分割单词function,delta_function方法&#xff08…