OpenCV-Python图像轮廓之轮廓特征详解

下面是详细讲解“OpenCV-Python图像轮廓之轮廓特征详解”的完整攻略。

一、背景介绍

在图像处理领域中,轮廓是很常见的概念。轮廓是用于表示图像中物体形状的连续曲线。轮廓可以很好地帮助我们对图像中的对象进行识别和检测。本文主要介绍OpenCV-Python中的轮廓特征。

二、轮廓基础

轮廓可以认为是一系列像素坐标点的集合,因此我们可以对轮廓进行计算并得到一些数值特征。轮廓通常是通过对图像进行阈值化和腐蚀处理得到的。

import cv2
import numpy as np

img = cv2.imread('contour.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
cv2.imshow('contour', img)
cv2.waitKey(0)

以上是绘制轮廓的基础代码,其中contour.png是原始图像的路径。这段代码逐行解释如下:

  1. cv2.imread()函数用于读取原始图像。

  2. cv2.cvtColor()用于将彩色图像转换为灰度图像。

  3. cv2.threshold()用于将灰度图像进行二值化处理。

  4. cv2.findContours()用于从二值化图像中查找轮廓。

  5. cv2.drawContours()用于绘制轮廓。

三、轮廓面积

轮廓面积是指轮廓所覆盖的像素面积。OpenCV提供了函数cv2.contourArea()来计算轮廓面积,其参数为轮廓。下面是示例代码:

import cv2
import numpy as np

img = cv2.imread('contour.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
    area = cv2.contourArea(contour)
    print(area)

以上代码用于计算每个轮廓的面积,并输出结果。

四、轮廓周长

轮廓周长是指轮廓的长度。OpenCV提供了函数cv2.arcLength()来计算轮廓周长,其参数为轮廓、轮廓是否闭合、近似精度。下面是示例代码:

import cv2
import numpy as np

img = cv2.imread('contour.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
    perimeter = cv2.arcLength(contour, True)
    print(perimeter)

以上代码用于计算每个轮廓的周长,并输出结果。

五、轮廓近似

轮廓近似是指对轮廓进行简化处理,以达到减少轮廓数据量和降低处理复杂度的目的。OpenCV提供了函数cv2.approxPolyDP()来进行轮廓近似,其参数为原始轮廓、距离阈值。下面是示例代码:

import cv2
import numpy as np

img = cv2.imread('contour.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
    epsilon = 0.1 * cv2.arcLength(contour, True)
    approx = cv2.approxPolyDP(contour, epsilon, True)
    cv2.drawContours(img, [approx], -1, (0, 0, 255), 2)

cv2.imshow('approx', img)
cv2.waitKey(0)

以上代码用于对轮廓进行简化,并将结果绘制在原始图像上。

六、轮廓凸包

凸包是用于包含轮廓所有点的最小凸形状。OpenCV提供了函数cv2.convexHull()来计算轮廓的凸包,其参数为轮廓、方向(默认是检测凸包的方向)和返回凸包结果类型(默认是NDArray),可以使用返回值判断点是否在凸包内。下面是示例代码:

import cv2
import numpy as np

img = cv2.imread('contour.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
    hull = cv2.convexHull(contour)
    cv2.drawContours(img, [hull], -1, (0, 0, 255), 2)

cv2.imshow('convex', img)
cv2.waitKey(0)

以上代码用于计算轮廓的凸包,并将结果绘制在原始图像上。

七、小结

本文介绍了OpenCV-Python中的轮廓特征,并给出了轮廓面积、轮廓周长、轮廓近似、轮廓凸包等示例。了解这些特征可以大大提高图像处理的效率和准确性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:OpenCV-Python图像轮廓之轮廓特征详解 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 如何使用python把ppt转换成pdf

    下面是详细的Python将PPT转化为PDF的攻略。 说明 通常,将PPT转换为PDF是很有用的,因为它使得投影文稿更不易被拼写错误或意外编辑,并在不同的设备上实现更广泛的可访问性。Python提供了一些库,可以将PPT转换为PDF,并可以使用Python解决PDF文档的格式问题。 在此,我们将涵盖如何使用Python(pptx和reportlab库)将pp…

    python 2023年6月5日
    00
  • Python实现用户名和密码登录

    我们开始讲解Python实现用户名和密码登录的完整攻略。步骤如下: 步骤一:建立用户登录页面 首先,我们需要建立一个用户登录页面,可以使用HTML和CSS建立一个简单的登录页面,代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&gt…

    python 2023年5月19日
    00
  • Python发送邮件测试报告操作实例详解

    我可以为您详细讲解“Python发送邮件测试报告操作实例详解”的完整攻略。具体流程如下: 1. 安装所需依赖库 在Python环境中,我们需要使用到一些第三方的库,包括smtplib和email。 可以使用如下命令进行安装: pip install smtplib pip install email 2. 编写邮件发送脚本 在发送邮件的脚本中,我们需要完成以…

    python 2023年5月20日
    00
  • 通过numba模块给Python代码提速的方法详解

    关于“通过numba模块给Python代码提速的方法详解”的攻略,我来给您详细讲解一下。 什么是numba? Numba是一个基于LLVM的Just-In-Time(JIT)编译器,可以把Python代码快速编译成本地机器码。Numba是专门为数值计算和科学计算领域设计的,主要功能是针对numpy数组和Python函数进行优化,从而提高代码的执行效率。 nu…

    python 2023年6月3日
    00
  • Python调用Fortran的三种形式

    那么接下来我将会为大家详细讲解Python调用Fortran的三种形式。 1. 使用Fortran子程序库(Shared Library) Fortran子程序库是编写Fortran程序时一种非常常用的形式,可以将Fortran代码编译为动态库(.so文件或.dll文件),并允许其他编程语言中的程序调用Fortran代码。Python可以使用ctypes库或…

    python 2023年6月2日
    00
  • Python Unittest ddt数据驱动的实现

    Python Unittest和ddt数据驱动是开发Python单元测试时常用的两个工具,结合使用可以大大提升测试效率和覆盖率。下面是一个完整的攻略,包括安装、使用和两个示例说明。 1. 安装 在使用之前,应该先安装Python Unittest和ddt库: pip install unittest pip install ddt 2. 使用 在编写Pyth…

    python 2023年6月3日
    00
  • python元组的可变与不可变问题

    Python元组的可变与不可变问题 介绍 Python中有多种基本数据类型,其中之一就是元组(Tuple)。元组是一个不可变的序列,和列表类似,但元组的元素不可修改。因此有时会产生对元组可变性的疑惑。 下面我们将详细讨论Python元组的可变性问题,并且通过示例来演示元组的可变性。 Python元组的不可变性 元组是Python的不可变序列类型,不可改变的意…

    python 2023年5月14日
    00
  • 基于Python实现商场抽奖小系统

    下面是基于Python实现商场抽奖小系统的完整攻略: 1. 确定系统需求 在开始编写代码前,我们需要先明确这个抽奖小系统需要具备哪些功能,例如: 能够生成一定数量的奖品,并将奖品存储在数据库中 能够在数据库中添加、删除、修改奖品的信息 能够在抽奖时从数据库中获取奖品信息,并展示给用户 能够实现抽奖过程,并在最终抽中奖品后将相关信息存储在数据库中 能够展示抽奖…

    python 2023年6月13日
    00
合作推广
合作推广
分享本页
返回顶部