Python OpenCV 影像处理:影像轮廓

► 前言

上篇介绍使用OpenCV Python对于图像上的二值化操作,二值化主要用途包括图像分割、物体侦测、文字识别等。这种转换可以帮助检测图像中的物体或特定特征,并提取有用的信息,本篇基于二值化操作进行近一步的操作,透过影像梯度区分影像前景、后景,框选所需目标物件。透过程式码的说明,让各位了解OpenCV Python于图像处理上的基本操作。

►轮廓(Contour)定义

轮廓是由多个点组成的连续曲线或多边形,这些点会包围物体或形状的边界。轮廓描述了物体在影像中的外形和轮廓的形状。这些轮廓提供了对物体形状和结构的描述,可以识别和理解影像中的物体。

►轮廓检测与绘制

OpenCV提供findContours()函数用于在二值化影像中寻找轮廓。

  1. image: 输入的二值化图像,通常是经过灰度转换和二值化处理后的图像。
  2. mode: 轮廓检测模式。它指定轮廓的检索模式,可以使用以下值之一:
    • RETR_EXTERNAL:只检测最外层的轮廓。
    • RETR_LIST:检测所有的轮廓,但不建构轮廓的层次结构。
    • RETR_CCOMP:检测所有的轮廓,并将其组织为两级层次结构。
    • RETR_TREE:检测所有的轮廓,并将其组织为完整的层次结构。
  3. method: 轮廓的逼近方法。它指定轮廓的逼近方法,可以使用以下值之一:
    • CHAIN_APPROX_NONE:储存所有的轮廓点,不进行逼近。
    • CHAIN_APPROX_SIMPLE:仅储存水平、垂直和对角线端点,压缩水平、垂直和对角线节点,只保留该方向上的终点。
  4. contours(可选): 轮廓的输出列表,每个轮廓是一个由点构成的 numpy 数组。
  5. hierarchy(可选): 输出的层次结构,描述了轮廓之间的嵌套关系。
  6. offset(可选): 输入图像的可选偏移参数。

并透过drawContours()函数将轮廓叠加于原始图像上。

  1. image: 用于绘制轮廓的图像。
  2. contours: 要绘制的轮廓,是一个包含轮廓的列表,每个轮廓是一个由点构成的 numpy 数组。
  3. contourIdx: 指定要绘制的轮廓的索引。如果为负值(例如 -1),则绘制所有轮廓。
  4. color: 绘制轮廓的颜色。它是一个包含三个整数的元组,分别表示蓝色、绿色和红色通道的值。
  5. thickness(可选): 绘制轮廓的线条宽度。如果 thickness 为正值,表示线条的粗细;如果 thickness 为负值或者等于 0,则轮廓内部被填充。
  6. lineType(可选): 绘制轮廓的线条类型。预设为 LINE_8,表示 8 连通线条。你也可以使用 cv2.LINE_AA 以获得抗锯齿效果。
  7. hierarchy(可选): 描述轮廓层次结构的 numpy 数组。在 findContours 中获取,通常不需要手动指定。
  8. maxLevel(可选): 绘制轮廓的最大层级。如果不指定,则绘制所有层级的轮廓。
  9. offset(可选): 输入图像的可选偏移参数。

在轮廓检测与绘制分为以下四个步骤:

  • 读取图像并转为灰度图
  • 灰度图像二值化
  • 检测轮廓
  • 绘制轮廓

►轮廓周长与面积计算

在 OpenCV 中,可以使用 cv2.arcLength 函数来计算轮廓的周长,使用 cv2.contourArea 函数来计算轮廓的面积。

  • contour:要计算周长的轮廓。
  • closed:一个布尔值,表示轮廓是否是封闭的。如果是封闭的,则 closed 设为 True;如果不是封闭的,则设为 False。
  • contour:要计算面积的轮廓。

►小结

透过以上讲解,搭配程式码进行范例讲解,相信各位对于图像上的轮廓检测能有更深刻的理解,期待下一篇博文吧!

►Q&A

问题一:图像不是二值化的,如何进行轮廓检测?

在进行轮廓检测之前,必须将图像转换为二值化形式。可以使用灰度转换和阈值处理来实现。确保你的图像经过适当的预处理。

问题二:找不到预期的轮廓,检测效果不好。

调整二值化的阈值或使用自适应阈值处理。有时候,图像的光线和对比度变化可能导致检测效果不佳,可以先进行适当的图像增强。

问题三:图像中有噪音或小的斑点,影响轮廓检测。

在进行轮廓检测之前,进行图像平滑处理,例如使用高斯滤波器或中值滤波器,以减少噪音的影响。

问题四:轮廓太多或太少,难以准确识别目标。

调整二值化的阈值,以控制检测到的轮廓数量。另外,可以使用形态学运算进行轮廓的调整和修复。

问题五:轮廓检测后如何进一步处理找到的轮廓?

根据应用需求,可以使用轮廓的特性进行进一步的筛选、过滤或分析。例如,可以根据轮廓的面积、长宽比等进行筛选,以排除不需要的轮廓。

►参考资料

OpenCV - Open Computer Vision Library

欢迎登录大大通,了解更多原厂技术方案、学习教程吧!

相关推荐
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
网易独家音乐人Mike Zhou3 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
安静读书3 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
小陈phd3 小时前
OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算
人工智能·opencv·计算机视觉
----云烟----4 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024064 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
小二·4 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it5 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康5 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud