首页 > 其他分享 >《OpenCV计算机视觉》—— 图像轮廓检测与绘制

《OpenCV计算机视觉》—— 图像轮廓检测与绘制

时间:2024-09-04 22:51:49浏览次数:11  
标签:phone cv2 近似 OpenCV contours 视觉 轮廓 绘制 he

文章目录

一、轮廓的检测

  • 轮廓检测是指在包含目标和背景的数字图像中,忽略背景和目标内部的纹理以及噪声干扰的影响,采用一定的技术和方法来实现目标轮廓提取的过程
  • 注意:做轮廓检测前需要将图片读取为二值数据,即像素值只为0和255
  • 轮廓检测所用到的函数为 cv2.findcontours(img, mode, method)
  • 参数介绍:
    • image:需要实现轮廓检测的原图
    • mode:轮廓的检索模式,主要有四种方式:
      • CV2.RETR_EXTERNAL:只检测外轮廓,所有子轮廓被忽略
      • CV2.RETR_LIST:检测的轮廓不建立等级关系,所有轮廓属于同一等级。
      • CV2.RETR_CCOMP: 检索所有的轮廓,并建立一个两级层次结构,其中上面的一层为外边界,里面的一层为内孔的边界轮廓。
      • CV2.RETR_TREE:返回所有的轮廓,建立一个完整的组织结构的轮廓。
    • method:轮廓的近似方法,主要有以下两种:
      • CV2.CHAIN_APPROX_NONE:存储所有的轮廓点。
      • CV2.CHAIN_APPROX_SIMPLE:压缩模式,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廊信息。
  • 返回的参数:image,contours,hierarchy
    • image:返回处理的原图(在 OpenCV 4.x 中这个返回值已经被移除)
    • contours:包含图像中所有轮廓的list对象。其中每一个独立的轮廓信息以边界点坐标(x,y)的形式储存在numpy数组中。
    • hierarchy:轮廓的层次结构。一个包含4个值的数组:[Next,Previous,First child,Parent]
      • Next:与当前轮廓处于同一层级的下一条轮廓
      • Previous:与当前轮廓处于同一层级的上一条轮廓
      • First Child:当前轮廓的第一条子轮廓
      • Parent:当前轮廓的父轮廓

二、轮廓的绘制

  • cv2.drawContours()函数是用于在图像上绘制轮廓
  • 参数介绍:cv2.drawContours(image, contours, contourIdx, color, thickness=None
    lineType=None, hierarchy=None, maxLevel=None, offset=None)
    • image:要在其上绘制轮廓的输入图像(在原图中画)。
    • contours:轮廓列表,通常由cv2.findContours()函数返回。
    • contourIdx:要绘制的轮廓的索引。如果为负数,则绘制所有轮廓。–> -1
    • color:轮廓的颜色,以BGR格式表示。例如,(0,255,0)表示绿色。
    • thickness:轮廓线的粗细,默认值为1。
    • lineType:轮廓线的类型。默认值为cV2.LINE_8
    • hierarchy:轮廓层次结构。通常由cv2.findContours()函数返回.
    • maxLevel:绘制的最大轮廓层级。默认值为None,表示绘制所有层级。
    • offset:轮廓点的偏移量。默认值为None。

图像轮廓检测与绘制的代码实现

import cv2

# 读取图片
phone = cv2.imread('phone.png')
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)  # 转换为灰度图

# 阙值处理为二值(黑白图像)
ret, phone_binary = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)
# 查找图像轮廓  cv2.RETR_LIST --> 查找所有轮廓,且不建立等级关系
_, contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
# 查看轮廓的层次结构
print(hierarchy)
# 查看一共有多少的轮廓
print(len(contours))

# 绘制所有的轮廓
Contours_show = cv2.drawContours(phone, contours=contours, contourIdx=-1, color=(0, 255, 0), thickness=3)

# 显示灰度图和在原图中绘出轮廓后的图
cv2.imshow('phone_gray', phone_gray)
cv2.imshow('Contours_show', Contours_show)

# 等待任意键按下后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 结果如下
    在这里插入图片描述

三、轮廓的近似

  • 轮廓的近似是计算机视觉和图像处理中的一个常用技术。它可以帮助我们简化轮廓的形状,去除一些不必要的细节,同时保持轮廓的主要形状特征。

  • 在OpenCV中,可以使用cv2.approxPolyDP()函数来近似一个轮廓。这个函数基于 Douglas-Peucker 算法,该算法通过迭代的方式简化轮廓的顶点集合,以生成一个近似于原始轮廓的多边形,但顶点数量更少。这在处理图像中的形状时非常有用,特别是当你想要去除轮廓上的小噪点或不必要的细节,同时保留其主要形状特征时。

  • 参数解释:cv2.approxPolyDP(curve, epsilon, closed)

    • curve:输入轮廓,通常是一个由点组成的 NumPy 数组,这些点定义了轮廓的形状。
    • epsilon:近似的精度参数。它是原始轮廓到近似多边形之间的最大距离。较小的 epsilon 值意味着近似多边形将更接近原始轮廓,但可能会包含更多的顶点。较大的 epsilon 值会导致生成一个更简单的多边形,但可能会丢失一些细节。
    • closed:一个布尔值,指定近似多边形是否应该是封闭的。如果为 True,则函数将确保近似多边形是封闭的,即第一个和最后一个顶点将相同。
  • 返回值 approx 是一个新的 NumPy 数组,包含了近似多边形的顶点。

  • 代码实现

    import cv2
    
    # 读取图像
    he = cv2.imread('he.png')
    
    # 转换为灰度图像
    he_gray = cv2.cvtColor(he, cv2.COLOR_BGR2GRAY)
    
    # 应用阈值处理
    ret, he_thresh = cv2.threshold(he_gray, 120, 255, cv2.THRESH_BINARY)
    
    # 查找轮廓
    _, contours, hierarchy = cv2.findContours(he_thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    # 创建一个新图像用于绘制轮廓
    he_new = he.copy()
    
    # 遍历所有轮廓
    for cnt in contours:
        # 轮廓近似
        # cv2.arcLength()函数用于计算轮廓的周长(近似的精度设置为周长的0.2%)
        epsilon = 0.002 * cv2.arcLength(cnt, True)  # 可以调整epsilon的值以获得不同的近似精度
        approx = cv2.approxPolyDP(cnt, epsilon, True)
    
        # 绘制近似后的轮廓
        cv2.drawContours(he_new, [approx], 0, (0, 255, 0), 3)
    
    # 显示原始图像和带有轮廓的图像
    cv2.imshow('Original Image', he)
    cv2.imshow('Image with Contours', he_new)
    
    # 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 结果如下
      在这里插入图片描述
    • 由结果可以看出轮廓的近似结果就是一个近似于原始轮廓的多边行。

标签:phone,cv2,近似,OpenCV,contours,视觉,轮廓,绘制,he
From: https://blog.csdn.net/weixin_73504499/article/details/141873522

相关文章

  • 【思考模型框架】因果关系图和因果回路图,通过绘制因果关系图,深入了解问题的本质,并找到
    一、定义1.1因果关系图因果关系图,是一种图形化表示方法,用于展示变量之间的因果关系。因果关系图,通常由节点(代表变量)和边(代表因果关系)组成。因果关系图,帮助人们理解复杂系统中不同因素是如何相互作用的。因果关系图,是一种用于分析问题原因和结果的思维工具。因果关系......
  • 《OpenCV计算机视觉》—— 模板匹配
    文章目录一、模板匹配简单介绍二、三个主要函数的介绍1.执行模板匹配函数-cv2.matchTemplate()2.查找最佳匹配函数-cv2.minMaxLoc()3.在原图上绘制匹配区域函数-cv2.rectangle()三、代码实现一、模板匹配简单介绍在Python中,模板匹配是一种在图像中查找与给定模板最......
  • 【计算机视觉前沿研究 热点 顶会】ECCV 2024中目标检测有关的论文
    整值训练和尖峰驱动推理尖峰神经网络用于高性能和节能的目标检测与人工神经网络(ANN)相比,脑激励的脉冲神经网络(SNN)具有生物合理性和低功耗的优势。由于SNN的性能较差,目前的应用仅限于简单的分类任务。在这项工作中,我们专注于弥合人工神经网络和神经网络在目标检测方面的性能......
  • (4-1-1)绘制柱状图:绘制基本的柱状图(1)
    柱状图又被称为柱形图、长条图、条状图或棒形图,是一种以长方形的长度为变量的统计图表。在现实应用中,经常使用柱状图来展示数据分析的结果,这样可以更加直观的展示数据分析结果。在本节的内容中,将详细讲解使用Python绘制柱状图的知识。4.1 绘制基本的柱状图在数据可视化分析......
  • OpenCV 之图像平滑处理
    引言图像平滑处理(也称为“模糊处理”)是计算机视觉中一项非常基础的技术,常用于减少图像噪声或失真,提高图像质量。平滑处理可以通过各种滤波器实现,常见的滤波器包括均值滤波、方框滤波、高斯滤波和中值滤波。本文将详细介绍这些滤波器的原理及其在OpenCV中的具体实现。基础概......
  • 深入浅出视觉分割大模型SAM(原理解析+代码实践)
    深入浅出视觉分割大模型SAM(原理解析+代码实践)视频地址:视觉分割大模型SAM(原理解析+代码实践)_哔哩哔哩_bilibili大家好,这里是肆十二,近两年来大模型的成果在一些领域的应用已经深入人心,由于我本人主要感兴趣的方向为计算机视觉,所以今天我们来一起看下计算机视觉领域中这个......
  • python 绘制折线图包括设置字体折线粗细以及标题立方m等
    #!usr/bin/envpython#-*-coding:utf-8-*-"""@author:Suyue@file:flyzhexian.py@time:2024/09/04@desc:"""importpandasaspdimportmatplotlibimportmatplotlib.pyplotaspltimportmatplotlib.tickerastickermatplot......
  • opencv轮廓近似,模板匹配
    在图像处理领域,轮廓近似和模板匹配是两种非常关键的技术,它们广泛应用于计算机视觉、图像分析和图像识别等多个方面。本文将详细介绍如何使用OpenCV库进行轮廓近似和模板匹配,并给出具体的代码示例。一、轮廓近似(ContourApproximation)轮廓近似是指将图像中的轮廓逼近成由直线......
  • 机器视觉检测的速度六大影响因素
    物料处理时间材料处理时间是指待检测材料暴露在图像采集介质前面,以便能够充分聚焦在材料上以获取图像的时间。在工业环境中,材料通常位于装配线或传送带上。相机是固定的或可移动的,放置在装配线的某个点。当材料进入相机的焦点区域时,材料处理时间开始,当材料完全聚焦时结束。这通常......
  • 【全网独家】OpenCV: 影像格式(Mat)
    OpenCV:影像格式(Mat)介绍在OpenCV中,Mat是一个非常重要的数据结构,用于表示二维的图像数据。它能够支持多种类型的数据存储,包括灰度图、彩色图以及多通道图像。特点多维矩阵:支持多维度矩阵操作。高效内存管理:使用引用计数来确保内存资源安全且高效地释放。灵活性:......