Opencv轮廓提取

一、轮廓提取的概念

图像轮廓是连接具有相同颜色和强度的所有连续点(边缘)的曲线。通过轮廓提取,可以找到图像中的物体边缘或者边缘之间的空隙,从而进行图像分割等一些列操作。

二、轮廓提取基本流程

在Opencv中,轮廓提取的基本流程包括以下几个步骤:

  1. 读入原始图像并进行灰度化处理。
  2. 对灰度图像进行二值化处理。
  3. 进行轮廓发现,得到轮廓点集。
  4. 绘制轮廓线。

下面是一个完整的示例代码:

import cv2

img = cv2.imread('example.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
cv2.imshow('contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、轮廓的性质

轮廓除了可以用于图像分割,还可以提供很多其他有用的信息,比如:轮廓面积、周长、质心、边界框、最小矩形等。

以下是示例代码:

import cv2

img = cv2.imread('example.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for i in range(len(contours)):
    area = cv2.contourArea(contours[i])
    arclen = cv2.arcLength(contours[i], True)
    moments = cv2.moments(contours[i])
    cx = int(moments['m10']/moments['m00'])
    cy = int(moments['m01']/moments['m00'])
    rect = cv2.boundingRect(contours[i])
    minRect = cv2.minAreaRect(contours[i])
    box = cv2.boxPoints(minRect)
    box = np.int0(box)

    cv2.drawContours(img, [box], 0, (0, 255, 0), 2)
    cv2.circle(img, (cx, cy), 2, (0, 0, 255), -1)
    cv2.rectangle(img, (rect[0], rect[1]), (rect[0]+rect[2], rect[1]+rect[3]), (255, 0, 0), 2)
    cv2.putText(img, str(i), (cx, cy), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)

cv2.imshow('contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、轮廓的近似

在实际应用中,为了降低轮廓点数,可以对轮廓进行近似处理,得到更加简化的轮廓曲线。常用的方法有:Douglas-Peucker算法和Ramirez-Schafer算法。

openCV提供了approxPolyDP函数进行轮廓近似,函数基本语法如下:

epsilon = cv2.approxPolyDP(curve, epsilon, closed)

其中,curve表示输入轮廓,epsilon为近似精度,closed为一个布尔值,表示曲线是否闭合。

以下是示例代码:

import cv2

img = cv2.imread('example.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

for i in range(len(contours)):
    epsilon = 0.01 * cv2.arcLength(contours[i], True)
    approx = cv2.approxPolyDP(contours[i], epsilon, True)
    cv2.drawContours(img, [approx], 0, (0, 0, 255), 2)

cv2.imshow('contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

五、总结

通过本文的介绍,我们可以看到轮廓提取在图像处理中的重要性。在实际应用中,我们可以根据轮廓的性质对物体进行检测、分割、识别等操作。同时,轮廓的近似处理也可以大大减少轮廓点数,提高图像处理效率。

原创文章,作者:FLMEG,如若转载,请注明出处:https://www.506064.com/n/324604.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
FLMEGFLMEG
上一篇 2025-01-13 13:23
下一篇 2025-01-13 13:23

相关推荐

  • 如何在PyCharm中安装OpenCV?

    本文将从以下几个方面详细介绍如何在PyCharm中安装OpenCV。 一、安装Python 在安装OpenCV之前,请确保已经安装了Python。 如果您还没有安装Python,可…

    编程 2025-04-29
  • Python OpenCV 直线检测

    本文将介绍在Python OpenCV中进行直线检测的方法,主要涉及到图像的边缘检测、霍夫变换和绘制直线等操作。 一、边缘检测 由于直线检测是从图像的边缘开始的,因此必须先找到图像…

    编程 2025-04-29
  • Opencv 实现读取 BMP 图片

    Opencv 是一个基于 C/C++ 语言的开源计算机视觉库,可以用于图像处理、特征识别、目标跟踪、机器学习等领域。在图像处理中,读取 BMP 图片是常见操作之一。 一、打开 BM…

    编程 2025-04-27
  • opencv鼠标绘图

    本文将为您详细介绍如何使用opencv在原始图片上进行鼠标绘图。 一、准备工作 在开始绘制之前,您需要先准备好以下的工作: 1、安装opencv库,可以通过pip install …

    编程 2025-04-27
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • OpenCV的全面介绍

    OpenCV是一款强大的开源计算机视觉库,它包含了各种用于图像和视频处理,图像识别和机器学习的函数,它可以用于开发实时的计算机视觉软件和系统,特别适用于图像处理、物体识别、人脸识别…

    编程 2025-04-25
  • Opencv CUDA编译用法介绍

    本文将从多个方面对Opencv CUDA编译进行详细的阐述和解读。通过以下小标题,我们将详细介绍如何进行编译。 一、环境搭建 在使用CUDA进行加速之前,需要进行CUDA的环境搭建…

    编程 2025-04-25
  • 详解OpenCV高斯滤波

    一、高斯滤波的介绍 OpenCV高斯滤波是一种平滑图像的处理方法,通常用于去除噪声、模糊化图像等。它的原理是利用高斯函数进行加权平均,从而减少噪声的干扰。 在图像处理中,噪声是一种…

    编程 2025-04-25
  • Clion配置OpenCV

    Clion是一个功能强大的跨平台集成开发环境,但要开发图像处理、计算机视觉等相关领域应用,需要将OpenCV集成到Clion中,才能方便地进行开发。本文将介绍如何在Clion中配置…

    编程 2025-04-24
  • OpenCV之cv2.imshow()

    一、cv2.imshow()介绍 cv2.imshow()是OpenCV中显示图像的主要函数之一。它可以显示传递给它的图像窗口,或者将图像作为选定窗口的内容。cv2.imshow(…

    编程 2025-04-24

发表回复

登录后才能评论