OpenCV基础之边缘检测与轮廓描绘

这篇具有很好参考价值的文章主要介绍了OpenCV基础之边缘检测与轮廓描绘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OpenCv基础之边缘检测与轮廓描绘

边缘检测:主要是通过一些手段检测数字图像中明暗变化剧烈(即梯度变化比较大)像素点,偏向于图像中像素点的变化。
轮廓检测:指在包含目标和背景的数字图像中,忽略背景和目标内部的纹理以及噪声干扰的影响,采用一定的技术和方法来实现目标轮廓提取的过程。主要用来分析物体的形态,比如物体的周长和面积等。

Canny边缘检测

图像的边缘是指图像局部区域亮度变化显著的部分,该区域的灰度剖面可以看作是一个阶跃,即从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。

# 1)使用高斯滤波器,以平滑图像,滤除噪声
# 2)计算图像中每个像素点的梯度强度和方向
# 3)应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应
# 4)应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘
# 5)通过抑制孤立的弱边缘最终完成边缘检测
canny_img=cv2.imread('img/girl.jpg')
# edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
# 参数 Image - 输入图片,必须为单通道的灰度图
# 参数 threshold1 和 threshold2 - 分别对应于阈值 minVal 和 maxVal
# 参数 apertureSize - 用于计算图片提取的 Sobel kernel 尺寸. 默认为 3.
# 参数 L2gradient - 指定计算梯度的等式. 当参数为 True 时,采用 2.2 中的梯度计算公式,其精度更高;否则采用的梯度计算公式为:
# 梯度|G|=|Gx|+|Gy|
v1=cv2.Canny(canny_img,80,150)
v2=cv2.Canny(canny_img,50,100)
# 展示边缘检测结果
res = np.hstack((v1,v2))
cv2.imshow('res',res)
cv2.waitKey(0)

注意,通过不同的阈值画出的图像边缘是不一样的,显然最小阈值低的,边缘更丰富。
opencv边缘检测 让轮廓闭合,计算机视觉,opencv,计算机视觉,人工智能

图像轮廓

  • cv2.cvtcolor()函数是一个颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间转换。也可以转换为灰度图。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
img=cv2.imread('img/backgrand.jpg')
# 读进去的是BGR格式的,但是在保存图片时,要保存为RGB格式的,可以用cv2.COLOR_BGR2RGB
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray ',gray )# 展示灰度图
cv2.waitKey(0)

opencv边缘检测 让轮廓闭合,计算机视觉,opencv,计算机视觉,人工智能

# 图像阈值:将像素值大于127的全部设置为255
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
cv2.imshow('thresh',thresh  )
cv2.waitKey(0)

opencv边缘检测 让轮廓闭合,计算机视觉,opencv,计算机视觉,人工智能

  • cv2.findContours(img,mode,method)
    • img: 二值图像

mode: 轮廓检索模式:
①RETR_EXTERNAL 只检索最外面的轮廓
②RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中
③RETR_CCOMP:检索所有的轮廓,并将他们组织为两层,顶层是各部分的外部边界,第二层是空洞的边界
④RETR_TREE:检索有所的轮廓,并重构嵌套轮廓的整个层次

method:轮廓逼近方法
①CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)
②CHAIN_APPROX_SIMPLE:压缩水平的,垂直的和斜的部分,也就是,函数只保留他们的终点部分。

注意:cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图。

  • contours,是一个向量,并且是一个双重向量,向量内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓。有多少轮廓,向量contours就有多少元素。
  • hierarchy也是一个向量,向量内每个元素保存了一个包含4个int整型的数组.hierarchy[i][0] ~hierarchy[i][3],分别表示第i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号.
    如果当前轮廓没有对应的后一个轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0]~hierarchy[i][3]的相应位被设置为默认值-1。

注意:可以通过cv2.findContours()函数的返回值contours,判断其轮廓线是否闭合,可以求其面积,周长等特点。

# 轮廓检测
binary,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
  • 函数cv2.drawContours()可以被用来绘制轮廓;它可以根据你提供的边界点绘制任何形状。

绘制轮廓

# 注意需要copy,要不原图会变
draw_img = img.copy()# draw_img = img是相同的
# 传入绘制图像,轮廓,轮廓索引(-1画所有轮廓),颜色模式(bgr),线条厚度
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)# 目前红色
cv2.imshow('res',res)
cv2.waitKey(0)

opencv边缘检测 让轮廓闭合,计算机视觉,opencv,计算机视觉,人工智能

这两个知识点比较容易混淆,所以笔者学习时也留意了一下,希望能够帮助到大家。同时,大家也可以通过matplotlib对图像进行输出,可以发现其输出图像颜色不同与OpenCV,这是由于两者三色通道顺序是不同的,需要进行转化。文章来源地址https://www.toymoban.com/news/detail-734662.html

到了这里,关于OpenCV基础之边缘检测与轮廓描绘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【OpenCV-Python】——边缘和轮廓&Laplacian/Sobel/Canny边缘检测&查找/绘制轮廓及轮廓特征&霍夫直线/圆变换

    目录 前言: 1、边缘检测 1.1 Laplacian边缘检测  1.2 Sobel边缘检测  1.3 Canny边缘检测 2、图像轮廓 2.1 查找轮廓  2.2 绘制轮廓 2.3 轮廓特征 3、霍夫变换 3.1 霍夫直线变换  3.2 霍夫圆变换 总结: 图像的边缘是指图像中灰度值急剧变化的位置,边缘检测的目的是为了绘制边缘线条。

    2024年01月23日
    浏览(47)
  • C++如何用OpenCV中实现图像的边缘检测和轮廓提取?

    主要实现代码:

    2024年02月07日
    浏览(39)
  • C++opencv找圆心?看着一篇,一定有你要(边缘轮廓检测,拟合,凸包)找出相应的轮廓或者全部轮廓画外界圆轮廓并且标出轮廓中心

    注意这种面积筛选有一个弊端就是比如有两个轮廓, A轮廓为500 B轮廓为300 当面积设置为 area400时就可以筛选出面积小于300的所有轮廓 反之大于300的轮廓 如果有两个圆轮廓一大一小,可能就只能保留一个了 如果知道这两个形状的轮廓面积,或许可以利用 逻辑与  进行筛选。

    2024年02月11日
    浏览(41)
  • 【OpenCv • c++】基础边缘检测算子 —— Laplace

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪        边缘检测是图像处理与计算机视觉中最重要的技术之一,

    2024年02月05日
    浏览(62)
  • 【OpenCv • c++】基础边缘检测算子 —— Sobel

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月03日
    浏览(51)
  • opencv基础49-图像轮廓02-矩特征cv2.moments()->(形状分析、物体检测、图像识别、匹配)

    矩特征(Moments Features)是用于图像分析和模式识别的一种特征表示方法,用来描述图像的形状、几何特征和统计信息。矩特征可以用于识别图像中的对象、检测形状以及进行图像分类等任务。 矩特征通过计算图像像素的高阶矩来提取特征。这些矩可以表示图像的中心、尺度

    2024年02月13日
    浏览(40)
  • opencv基础41-图像梯度-sobel算子详解cv2.Sobel()(边缘检测基础)

    图像梯度是用于描述图像变化率的概念。在图像处理中,梯度指的是图像中每个像素的灰度值变化速率或方向。它常用于边缘检测和图像特征提取。 一维图像的梯度表示为函数 f(x) 的导数,而在二维图像中,梯度是一个向量,包含两个分量:水平方向和垂直方向的灰度变化率

    2024年02月14日
    浏览(46)
  • 数字图像处理【11】OpenCV-Canny边缘提取到FindContours轮廓发现

    本章主要介绍图像处理中一个比较基础的操作:Canny边缘发现、轮廓发现 和 绘制轮廓。概念不难,主要是结合OpenCV 4.5+的API相关操作,为往下 \\\"基于距离变换的分水岭图像分割\\\" 做知识储备。 在讲述轮廓之前,要花点时间学学边缘检测提取的一个著名算法——Canny边缘提取算法

    2024年02月16日
    浏览(38)
  • OpenCV(三十二):轮廓检测

    1.轮廓概念介绍         在计算机视觉和图像处理领域中,轮廓是指在图像中表示对象边界的连续曲线。它是由一系列相邻的点构成的,这些点在边界上连接起来形成一个封闭的路径。 轮廓层级:        轮廓层级(Contour Hierarchy)是指在包含多个轮廓的图像中,轮廓之间的

    2024年02月07日
    浏览(51)
  • OpenCV 图像轮廓检测

            本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式、轮廓逼近算子等操作。         图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检测和识别中很有用。图像轮廓的作用

    2024年01月25日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包