OpenCV边缘检测与视频读写

news2025/1/16 11:18:27

原理

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

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

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

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

  • 基于搜索:通过寻找图像一阶导数中的最大值来检测边界,然后利用计算结果估计边缘的局部方向,通常采用梯度的方向,并利用此方向找到局部梯度模的最大值,代表算法是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()

 

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:

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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1458869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[OpenAI]继ChatGPT后发布的Sora模型解析与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

C++11---(2)

目录 一、新增容器 1.1、array 1.2、forward_list 1.3、unordered系列 二、右值引用和移动语义 2.1、什么是左值,什么是左值引用 2.2、什么是右值,什么是右值引用 2.3、左值引用和右值引用比较 2.4、右值引用使用场景和意义 2.5、右值引用引用…

利用ChatGPT提升测试工作效率——测试工程师的新利器

1、前言 随着ChatGPT的爆火,各个行业开始尝试利用ChatGPT来提升工作效率。其中,测试工程师们也开始探索如何应用ChatGPT来加强测试工作。在本文中,我们将从测试工程师的角度出发,探讨ChatGPT在测试工作中的应用。通过ChatGPT&…

如何使用Docker搭建YesPlayMusic网易云音乐播放器并发布至公网访问

文章目录 1. 安装Docker2. 本地安装部署YesPlayMusic3. 安装cpolar内网穿透4. 固定YesPlayMusic公网地址 本篇文章讲解如何使用Docker搭建YesPlayMusic网易云音乐播放器,并且结合cpolar内网穿透实现公网访问音乐播放器。 YesPlayMusic是一款优秀的个人音乐播放器&am…

阿里云服务器镜像是什么?如何选择镜像?

阿里云服务器镜像怎么选择?云服务器操作系统镜像分为Linux和Windows两大类,Linux可以选择Alibaba Cloud Linux,Windows可以选择Windows Server 2022数据中心版64位中文版,阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器操…

社区店经营全攻略:如何选址、运营并打造火爆生意?

随着电商的兴起,实体店的经营面临着越来越多的挑战。然而,社区店依然具有独特的优势,如便捷的地理位置、与消费者的紧密互动等。 作为在社区店开鲜奶吧5年的创业者,我深有感触,那么这篇文章将为你提供最有价值的干货信…

SpringBoot+WebSocket实现即时通讯(四)

前言 紧接着上文《SpringBootWebSocket实现即时通讯(三)》 本博客姊妹篇 SpringBootWebSocket实现即时通讯(一)SpringBootWebSocket实现即时通讯(二)SpringBootWebSocket实现即时通讯(三&…

代码随想录算法训练营第十八天|235.二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树节点

235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树节点 235.二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近…

函数指针概念的理解要点

1:理解函数 函数即为代码,代码就应该放在内存中,是内存,就有地址 void CmpFun(int a,int b){if(a>b)printf("最大的数为%d",a);elseprintf("最大的数为%d",b);}int main(){printf("输出函数CmpFu…

redo日志——log buffer与磁盘的交互详解

目录 一、redo日志刷盘机制(时机) 1、log buffer 空间不足时 2、事务提交 3、后台线程 4、正常关闭服务器 5、checkpoint时 二、数据目录中的redo日志文件 三、redo日志文件格式 log buffer与磁盘交互的最小单位——block 文件格式 四、Log Se…

Generator生成器函数

<script>//三个ajax异步的请求要保证执行的顺序//1. 传统的callback触发回调地狱 痛苦 处理异步任务按照顺序 异步-->同步化执行 代码的可读性更好//2. promise then then语义化明显//3.Generator生成函数//4.async await //ajax函数 xhr//XHR代表 "XMLHttp…

STM32 系统滴答时钟启动过程 SysTick_Config

STM32 系统滴答时钟启动过程 SysTick_Config 1. 系统滴答时钟1.1 简介1.2 配置1.3 启动和更新 1. 系统滴答时钟 1.1 简介 SysTick&#xff1a;系统滴答时钟&#xff0c;属于Cortex-M4内核中的一个外设&#xff0c;24bit向下递减计数。 Systick定时器常用来做延时&#xff0c;…

Jenkins配置node节点

1、添加节点 2、配置node主机的java环境 注意&#xff0c;jdk的位置和版本要和master保持一致 sudo apt-get update sudo apt-get install openjdk-8-jre vim /etc/enviroment写入&#xff1a;export JAVA_HOME/usr/lib/jvm/openjdk-8-jre 按wq!退出 再输入&#xff1a;s…

onlyoffice jsApi调用 进阶二次开发 连接器开发 api操作office文档 demo可直接运行测试

office这个体系分为四个大教程 1、【document server文档服务器基础搭建】 2、【连接器(connector)或者jsApi调用操作office】-进阶 3、【document builder文档构造器使用】-进阶 4、【Conversion API(文档转化服务)】-进阶 如果需要连接器&#xff0c;可以查看&#xff1a…

动态gif怎么在线生成?一招快速搞定gif动画

在我们生活沟通中都会运用到各种生动有趣gif动图。很多时候我们在使用gif动图的时候都需要从网上下载找起来很麻烦。那么&#xff0c;自己怎么制作gif动态图片呢&#xff1f;很简单&#xff0c;使用Gif制作&#xff08;https://www.gif.cn/&#xff09;工具&#xff0c;不需要下…

前端|Day3:CSS基础(黑马笔记)

Day3:CSS基础 目录 Day3:CSS基础一、CSS初体验二、CSS引入方式三、选择器1.标签选择器2.类选择器3.id选择器4.通配符选择器 四、盒子尺寸和背景色五、文字控制属性1.字体大小2.字体样式&#xff08;是否倾斜&#xff09;3.行高单行文字垂直居中 4.字体族5.font复合属性6.文本缩…

XGB-7: 特征交互约束

决策树是发现自变量&#xff08;特征&#xff09;之间交互关系的强大工具。在遍历路径中一起出现的变量是相互交互的&#xff0c;因为子节点的条件取决于父节点的条件。例如&#xff0c;在下图中&#xff0c;红色突出显示的路径包含三个变量&#xff1a; x 1 x_1 x1​、 x 7 x_…

facebook群控如何做?静态住宅ip代理在多账号运营重的作用

在进行Facebook群控时&#xff0c;ip地址的管理是非常重要的&#xff0c;因为Facebook通常会检测ip地址的使用情况&#xff0c;如果发现有异常的使用行为&#xff0c;比如从同一个ip地址频繁进行登录、发布内容或者在短时间内进行大量的活动等等&#xff0c;就会视为垃圾邮件或…

探究二维码技术:连接现实与数字世界的桥梁

title: 探究二维码技术&#xff1a;连接现实与数字世界的桥梁 date: 2024/2/19 13:15:36 updated: 2024/2/19 13:15:36 tags: 二维码技术数据编码纠错算法图像处理商业应用安全验证实时交互 引言&#xff1a; 二维码已经成为现代社会中广泛应用的一种技术工具。它不仅在商业领…

C#,二进制数的按位交换(Bits swap)的算法与源代码

数字在指定位置指定位数的交换是常见算法。 1 源程序 using System; using System.Text; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer.Algorithm { public static partial class Algorithm_Gallery { /// <…