OpenCV边缘检测与视频读写

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

原理

OpenCV中的边缘检测原理主要基于图像梯度的计算,包括一阶梯度和二阶梯度。

  • 一阶梯度:它反映了图像亮度变化的速度。Sobel算法就是一种以一阶梯度为基础的边缘检测算法。它通过计算图像在水平和垂直方向上的梯度来检测边缘。这种方法简单有效,但对于噪声较为敏感。
  • 二阶梯度:它描述了图像亮度变化率的变化,可以用于检测图像中的细线和角落。Laplacian算法就是基于二阶梯度的边缘检测算法,它对边缘的定位非常准确,但同样对噪声比较敏感。

边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。边缘的表现形式:

OpenCV边缘检测与视频读写,OpenCV,opencv,人工智能,计算机视觉

 图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。边缘检测可以划分为两类:基于搜索和基于零穿越

  • 基于搜索:通过寻找图像一阶导数中的最大值来检测边界,然后利用计算结果估计边缘的局部方向,通常采用梯度的方向,并利用此方向找到局部梯度模的最大值,代表算法是Sobel算子和Scharr算子。
  • 基于零穿越:通过寻找图像二阶导数零穿越来寻找边界,代表算法是Laplacian算子。

Sobel检测算子

Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,但是很多实际应用的场合,sobel边缘却是首选,Sobel算子是高斯平滑与微分操作的结合体,所以其抗噪声能力很强,用途较多。尤其是效率要求较高,而对细纹理不太关心的时候。

OpenCV中常用的边缘检测算法包括Sobel、Scharr、Laplacian和Canny等。

  1. Sobel算法:通过计算图像亮度的空间梯度来检测边缘,通常用于水平和垂直边缘的检测。
  2. Scharr算法:与Sobel类似,但使用了不同的核来计算梯度,通常能提供更精确的边缘检测结果。
  3. Laplacian算法:通过计算图像的二阶导数来检测边缘,对边缘的定位非常准确,但对噪声也比较敏感。
  4. Canny算法:是一个多阶段的边缘检测算法,包括使用高斯滤波器平滑图像、计算梯度幅度和方向、应用非最大抑制以及使用双阈值法进行边缘跟踪。Canny算法被认为是一种最优的边缘检测方法,因为它试图最小化误检和漏检的边缘。

API 

 利用OpenCV进行sobel边缘检测的API是cv2.Sobel() 函数。

Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, ksize) 

  • src:传入的图像

  • ddepth: 图像的深度

  • dx和dy: 求导的阶数,0表示这个方向上没有求导,取值为0、1。

  • ksize: Sobel算子的大小,必须为奇数1、3、5、7,默认为3。

Sobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8,即8位无符号数,所以Sobel建立的图像位数不够,会有截断。因此要使用16位有符号的数据类型,即cv2.CV_16S。处理完图像后,再使用cv2.convertScaleAbs()函数将其转回原来的uint8格式,否则图像无法显示。

Sobel算子是在两个方向计算的,最后还需要用cv2.addWeighted( )函数将其组合起来

Scale_abs = cv2.convertScaleAbs(x)  
result = cv2.addWeighted(src1, alpha, src2, beta)

 案例:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img = cv.imread('/h.jpg',0)

x = cv.Sobel(img, cv.CV_16S, 1, 0)
y = cv.Sobel(img, cv.CV_16S, 0, 1)

Scale_absX = cv.convertScaleAbs(x)  
Scale_absY = cv.convertScaleAbs(y)

result = cv.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)

plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(result,cmap = plt.cm.gray),plt.title('Sobel')
plt.xticks([]), plt.yticks([])
plt.show()

 OpenCV边缘检测与视频读写,OpenCV,opencv,人工智能,计算机视觉

Laplacian算子 

Laplacian算子,也称为拉普拉斯算子,是数学中的一个二阶微分算子,用于描述函数在邻域平均值与差的平均值之间的关系

Laplacian算子在多个领域有着广泛的应用,包括但不限于:

  • 数学领域:在数学中,Laplacian算子被用于定义在欧几里得空间中的二阶微分算子,它可以表示为梯度(grad)的散度(div)。这个算子可以用来描述保守场或有势场的性质,例如静电场或引力场。
  • 物理领域:在物理学中,Laplacian算子经常出现在描述物理系统的偏微分方程中,如电磁学中的Poisson方程,它用来求解静电势分布问题。

此外,在图像处理中,Laplacian算子可以用于边缘检测,通过计算图像的二阶导数来检测图像中的边缘,这对于图像识别和计算机视觉任务非常重要。

API:

laplacian = cv2.Laplacian(src, ddepth, ksize) 

 

  • Src: 需要处理的图像,
  • Ddepth: 图像的深度,-1表示采用的是原图像相同的深度,目标图像的深度必须大于等于原图像的深度;
  • ksize:算子的大小,即卷积核的大小,必须为1,3,5,7。

案例:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img = cv.imread('ho.jpg',0)

result = cv.Laplacian(img,cv.CV_16S)
Scale_abs = cv.convertScaleAbs(result)

plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(Scale_abs,cmap = plt.cm.gray),plt.title('Laplacian')
plt.xticks([]), plt.yticks([])

 Canny边缘检测

Canny边缘检测是一种基于灰度突变的边缘检测算法,主要用于提取图像中不连续部分的特征,以便将图像分割成不同的子区域或轮廓线

Canny边缘检测算法包括以下几个关键步骤:

  1. 高斯滤波:使用高斯滤波器对图像进行平滑处理,以减少图像噪声对边缘检测的影响。
  2. 像素梯度计算:计算图像中每个像素的梯度幅度和方向,这有助于确定边缘的强度和方向。
  3. 非极大值抑制:只保留梯度幅度最大的像素,抑制其他非极大值像素,这样可以减少边缘检测中的伪边缘。
  4. 滞后阈值处理:使用两个阈值(高阈值和低阈值)来确定真正的边缘,强边缘通过高阈值被直接标记,而弱边缘只有在连接到强边缘时才被标记。
  5. 孤立弱边缘抑制:去除那些没有连接到强边缘的孤立弱边缘,以得到更加清晰的边缘检测结果。

在OpenCV中要实现Canny检测使用的API:

canny = cv2.Canny(image, threshold1, threshold2)  

 

  • image:灰度图,
  • threshold1: minval,较小的阈值将间断的边缘连接起来
  • threshold2: maxval,较大的阈值检测图像中明显的边缘
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

img = cv.imread('ho.jpg',0)

lowThreshold = 0
max_lowThreshold = 100
canny = cv.Canny(img, lowThreshold, max_lowThreshold) 

plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('原图')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(canny,cmap = plt.cm.gray),plt.title('Canny')
plt.xticks([]), plt.yticks([])

 视频读写

创建读取视频的对象:

cap = cv.VideoCapture(filepath)

 

  • filepath: 视频文件路径

  • 视频的属性信息

获取视频的某些属性:

retval = cap.get(propId) 

  • propId: 从0到18的数字,每个数字表示视频的属性 

修改视频的属性信息:

cap.set(propId,value)  

  • proid: 属性的索引,与上面的表格相对应
  • value: 修改后的属性值

isornot = cap.isOpened() 

  • 若读取成功则返回true,否则返回False

  • 获取视频的一帧图像

 ret, frame = cap.read()

  • ret: 若获取成功返回True,获取失败,返回False
  • Frame: 获取到的某一帧的图像

  • 调用cv.imshow()显示图像,在显示图像时使用cv.waitkey()设置适当的持续时间,如果太低视频会播放的非常快,如果太高就会播放的非常慢,通常情况下我们设置25ms就可以了。

  • 最后,调用cap.realease()将视频释放掉

创建视频写入的对象:

out = cv2.VideoWriter(filename,fourcc, fps, frameSize)

  • filename:视频保存的位置
  • fourcc:指定视频编解码器的4字节代码
  • fps:帧率
  • frameSize:帧大小

 eg:文章来源地址https://www.toymoban.com/news/detail-832253.html

import cv2 as cv
import numpy as np


cap = cv.VideoCapture("cat.wmv")

frame_width = int(cap.get(3))
frame_height = int(cap.get(4))


out = cv.VideoWriter('outpy.avi',cv.VideoWriter_fourcc('M','J','P','G'), 10, (frame_width,frame_height))
while(True):
    # 获取视频的每一帧图像
    ret, frame = cap.read()
    if ret == True: # 将每一帧图像写入到输出文件        
        out.write(frame)
    else:
        break 

cv.destroyAllWindows()

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

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

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

相关文章

  • OpenCV入门(十四)快速学会OpenCV 13 边缘检测

    作者:Xiou 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化,包括深度不连续、表面方向不连续、物质属性变化和场景照明变化。边缘检测特征是提取中的一个研

    2024年02月04日
    浏览(35)
  • 【OpenCV--边缘检测】

    目录 一、边缘检测概念 二、Sobel算子 1.描述: 2.方法: 3.Sobel算子的应用:  三、Laplacian算子 1.描述: 2.应用: 四、Canny边缘检测 1.原理: 2.应用: 1.边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点,往往以轮廓的形式表

    2024年02月01日
    浏览(30)
  • opencv#33 边缘检测

         图像的每一行每一列都可以看成是一个连续的信号经过离散后得到的数值,例如上图左侧给出的图像由黑色到白色的一个信号,也就是图像中某一行像素变化是由黑色逐渐到白色,我们将其对应在一个坐标轴中,将像素值的大小对应与我们y轴,我们可以得到中间图片的

    2024年01月25日
    浏览(23)
  • opencv#34 边缘检测(二)

    前面介绍的Sobel算子和Scharr算子存在的问题: 1.要分别计算两个方向(x,y)的边缘,之后将两方向的边缘进行叠加。 2.边缘与方向相关性较大。当我们通过Sobel算子提取x方向检测时,它所能够检测到的边缘都是一个沿着y轴方向的边缘,与检测的方向相反(垂直方向),当进行y方向

    2024年01月25日
    浏览(24)
  • OpenCV——Scharr边缘检测

    OpenCV——Scharr边缘检测由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。    Scharr边缘检测算法是对Sobel算子差异性的增强,因此两者在检测图像边缘的原理和使用方式上相同。Scharr算子的边缘检测滤波尺寸为3x3,因此也

    2024年01月23日
    浏览(33)
  • OpenCV(二十六):边缘检测(二)

    目录 1.Laplacian算子边缘检测 原理: Laplacian边缘检测函数Laplacian() 示例代码: 2.Canny算子边缘检测 原理: Canny算法函数Canny() 示例代码: 1.Laplacian算子边缘检测 原理:         Laplacian算子的原理基于图像的二阶导数。一阶导数可以帮助我们检测图像中的边缘,而二阶导数则可

    2024年02月09日
    浏览(26)
  • 基于opencv的边缘检测方法

    用OpenCV的形态变换( 膨胀、腐蚀、开运算和闭运算)函数morphologyEx 梯度运算即膨胀结果-腐蚀结果: 【注意】对于二值图像来说,必须是前景图像为白色,背景为黑色,否则需要进行反二值化处理 可以计算不同方向的梯度,梯度运算如下图所示: 得出x方向的梯度值和y方向

    2024年02月02日
    浏览(24)
  • OpenCV——Canny边缘检测算法

    图像分割是将数字图像细分为多个子区域的过程,在计算机视觉/机器视觉领域被广泛应用。它的目的是简化或改变图像的表示形式,以便更容易理解和分析。常见的图像分割方法包括阈值处理、聚类法、边缘检测和区域生长等。解决图像分割问题通常需要结合领域知识,以提

    2024年04月17日
    浏览(30)
  • OpenCV 如何实现边缘检测器

    返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV如何实现拉普拉斯算子的离散模拟 下一篇 :OpenCV系列文章目录(持续更新中......) 在本教程中,您将学习如何: 使用 OpenCV 函数 cv::Canny 实现 Canny 边缘检测器。 Canny Edge探测器 [48]由John F. Canny于1986年开发。Canny 算法

    2024年04月25日
    浏览(29)
  • OpenCV边缘检测:findContours()、approxPolyDP()

    参数 src 原图 cv2.RETR_TREE:提取轮廓后,输出轮廓信息的组织形式,除了cv2.RETR_TREE还有以下几种选项: cv2.RETR_EXTERNAL:输出轮廓中只有外侧轮廓信息; cv2.RETR_LIST:以列表形式输出轮廓信息,各轮廓之间无等级关系; cv2.RETR_CCOMP:输出两层轮廓信息,即内外两个边界(下面将会

    2024年02月06日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包