OpenCV:图像轮廓

目录

简述

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.mzph.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. 揭示卷积和自注意力的内在联系 文章通过重新分解卷积和自…

    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…

    【Elasticsearch】post_filter

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

    从零开始:用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对注…

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

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

    【工具变量】中国省级八批自由贸易试验区设立及自贸区设立数据(2024-2009年)

    一、测算方式:参考C刊《中国软科学》任晓怡老师(2022)的做法,使用自由贸易试验区(Treat Post) 表征,Treat为个体不随时间变化的虚拟变量,如果该城市设立自由贸易试验区则赋值为1,反之赋值为0&am…

    Java进阶总结——集合

    Java进阶总结——集合 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下。Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实…

    计算机视觉和图像处理

    计算机视觉与图像处理的最新进展 随着人工智能技术的飞速发展,计算机视觉和图像处理作为其中的重要分支,正逐步成为推动科技进步和产业升级的关键力量。 一、计算机视觉的最新进展 计算机视觉,作为人工智能的重要分支,主要研究如…

    3.PPT:华老师-计算机基础课程【3】

    目录 NO12​ NO34​ NO56​ NO789​ NO12 根据考生文件夹下的Word文档“PPT素材.docx”中提供的内容在PPT.pptx中生成初始的6张幻灯片 新建幻灯片6张→ctrlc复制→ctrlv粘贴开始→新建幻灯片→幻灯片(从大纲)→Word文档注❗前提是:Word文档必须应用标题1、标题2…

    (三)QT——信号与槽机制——计数器程序

    目录 前言 信号(Signal)与槽(Slot)的定义 一、系统自带的信号和槽 二、自定义信号和槽 三、信号和槽的扩展 四、Lambda 表达式 总结 前言 信号与槽机制是 Qt 中的一种重要的通信机制,用于不同对象之间的事件响…

    基于多智能体强化学习的医疗AI中RAG系统程序架构优化研究

    一、引言 1.1 研究背景与意义 在数智化医疗飞速发展的当下,医疗人工智能(AI)已成为提升医疗服务质量、优化医疗流程以及推动医学研究进步的关键力量。医疗 AI 借助机器学习、深度学习等先进技术,能够处理和分析海量的医疗数据,从而辅助医生进行疾病诊断、制定治疗方案以…

    Redis --- 秒杀优化方案(阻塞队列+基于Stream流的消息队列)

    下面是我们的秒杀流程: 对于正常的秒杀处理,我们需要多次查询数据库,会给数据库造成相当大的压力,这个时候我们需要加入缓存,进而缓解数据库压力。 在上面的图示中,我们可以将一条流水线的任务拆成两条流水…

    使用 Ollama 和 Kibana 在本地为 RAG 测试 DeepSeek R1

    作者:来自 Elastic Dave Erickson 及 Jakob Reiter 每个人都在谈论 DeepSeek R1,这是中国对冲基金 High-Flyer 的新大型语言模型。现在他们推出了一款功能强大、具有开放权重的思想链推理 LLM,这则新闻充满了对行业意味着什么的猜测。对于那些…

    2025年大年初一篇,C#调用GPU并行计算推荐

    C#调用GPU库的主要目的是利用GPU的并行计算能力,加速计算密集型任务,提高程序性能,支持大规模数据处理,优化资源利用,满足特定应用场景的需求,并提升用户体验。在需要处理大量并行数据或进行复杂计算的场景…

    Unity 2D实战小游戏开发跳跳鸟 - 计分逻辑开发

    上文对障碍物的碰撞逻辑进行了开发,接下来就是进行跳跳鸟成功穿越过障碍物进行计分的逻辑开发,同时将对应的分数以UI的形式显示告诉玩家。 计分逻辑 在跳跳鸟通过障碍物的一瞬间就进行一次计分,计分后会同步更新分数的UI显示来告知玩家当前获得的分数。 首先我们创建一个用…