深度学习之 OpenCV 图像边缘检测算法解析及代码演示

news2024/9/23 15:19:14
引言

在计算机视觉领域,边缘检测是一种重要的图像预处理技术,用于识别图像中对象的边界。边缘检测有助于提取图像的关键特征,这对于后续的图像分析(如物体识别、运动检测等)至关重要。OpenCV 是一个强大的计算机视觉库,提供了多种边缘检测算法。本文将重点介绍如何使用 OpenCV 进行图像边缘检测,并通过具体的代码示例来展示 Sobel 算子的应用。

Sobel 算子原理

Sobel 算子是一种广泛使用的边缘检测方法,它利用两个 3x3 的卷积核来分别计算图像在水平方向(x 方向)和垂直方向(y 方向)上的梯度。这两个卷积核如下所示:

  • 水平方向(x 方向)梯度核

  • 垂直方向(y 方向)梯度核

通过这两个核对图像进行卷积操作,可以获得图像在各个方向上的梯度信息,进而识别出图像中的边缘。

代码演示
  1. 导入库和读取图像

    1import cv2
    2
    3yuan = cv2.imread('yuan.png')
    4cv2.imshow('原图', yuan)
    5cv2.waitKey(0)

    解释:

    • 导入 cv2 库。
    • 使用 cv2.imread 函数读取名为 yuan.png 的图像文件。
    • 显示原始图像,并等待用户按键继续。
  2. x 方向上的边缘

    1# x方向上的边缘
    2yuan_x = cv2.Sobel(yuan, -1, dx=1, dy=0)
    3cv2.imshow('x方向边缘', yuan_x)
    4cv2.waitKey(0)

    解释:

    • 使用 cv2.Sobel 函数计算 x 方向上的边缘。
    • dx=1 表示在 x 方向上求一阶导数,dy=0 表示在 y 方向上保持不变。
    • 显示 x 方向上的边缘图像,并等待用户按键继续。
  3. x 方向上的边缘(包括负数信息)

    1# x方向上的边缘,包括负数信息(右端),但显示不出来,因为范围是(0~255)
    2yuan_x_64 = cv2.Sobel(yuan, cv2.CV_64F, dx=1, dy=0)  # 默认 uint8 改为 float64,可保存负数
    3cv2.imshow('x方向边缘(浮点型)', yuan_x_64)
    4cv2.waitKey(0)

    解释:

    • 将数据类型改为 cv2.CV_64F 以便保存负数。
    • 显示 x 方向上的边缘图像,但由于数据类型为浮点型,直接显示可能看不到清晰的边缘。
  4. x 方向上的边缘(包括负数信息,取绝对值)

    1# x方向上的边缘,包括负数信息,进行取绝对值的操作,右端的负值信息就可以显示出来了
    2yuan_x_full = cv2.convertScaleAbs(yuan_x_64)  # 转换为绝对值,负数转换为正数
    3cv2.imshow('x方向边缘(绝对值)', yuan_x_full)
    4cv2.waitKey(0)

    解释:

    • 使用 cv2.convertScaleAbs 函数将浮点型数据转换为整数型数据,并取绝对值。
    • 显示 x 方向上的边缘图像,此时可以看到清晰的边缘。
  5. y 方向上的边缘

    1# y方向上的边缘
    2yuan_y = cv2.Sobel(yuan, -1, dx=0, dy=1)
    3cv2.imshow('y方向边缘', yuan_y)
    4cv2.waitKey(0)

    解释:

    • 使用 cv2.Sobel 函数计算 y 方向上的边缘。
    • dx=0 表示在 x 方向上保持不变,dy=1 表示在 y 方向上求一阶导数。
    • 显示 y 方向上的边缘图像,并等待用户按键继续。
  6. y 方向上的边缘(包括负数信息,取绝对值)

    1# y方向上的边缘,包括负数信息(下端),但显示不出来,因为范围是(0~255)
    2yuan_y_64 = cv2.Sobel(yuan, cv2.CV_64F, dx=0, dy=1)  # 默认 int8 改为 float64,可保存负数
    3yuan_y_full = cv2.convertScaleAbs(yuan_y_64)  # 转换为绝对值,负数转换为正数
    4cv2.imshow('y方向边缘(绝对值)', yuan_y_full)
    5cv2.waitKey(0)

    解释:

    • 将数据类型改为 cv2.CV_64F 以便保存负数。
    • 使用 cv2.convertScaleAbs 函数将浮点型数据转换为整数型数据,并取绝对值。
    • 显示 y 方向上的边缘图像,此时可以看到清晰的边缘。
  7. 同时使用 x 和 y 方向的结果

    1# 如果同时使用 x,y 方向的结果如何呢?(不建议使用)
    2yuan_xy = cv2.Sobel(yuan, -1, dx=1, dy=1)
    3cv2.imshow('xy方向边缘', yuan_xy)
    4cv2.waitKey(100000)

    解释:

    • 使用 cv2.Sobel 函数计算 x 和 y 方向上的边缘。
    • dx=1 表示在 x 方向上求一阶导数,dy=1 表示在 y 方向上也求一阶导数。
    • 显示 xy 方向上的边缘图像,并等待用户按键继续。
  8. 使用图像加权运算组合 x 和 y 方向的 2 个边缘

    1# 使用图像加权运算组合 x 和 y 方向的 2 个边缘
    2yuan_xy_full = cv2.addWeighted(yuan_x_full, 1, yuan_y_full, 1, 0)
    3cv2.imshow('xy方向边缘(加权组合)', yuan_xy_full)
    4cv2.waitKey(0)

    解释:

    • 使用 cv2.addWeighted 函数将 x 方向和 y 方向的边缘图像进行加权组合。
    • 显示组合后的边缘图像,并等待用户按键继续。
输出结果:

总结

通过以上代码演示,我们展示了如何使用 OpenCV 的 Sobel 算子进行图像边缘检测。Sobel 算子通过计算图像在 x 和 y 方向上的梯度,能够有效地识别出图像中的边缘。此外,通过调整数据类型和使用绝对值转换,我们能够更好地显示边缘信息。这种边缘检测技术在许多计算机视觉应用中都有重要作用,如物体识别、运动检测等。

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

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

相关文章

Zabbix 企业级高级应用(Zabbix Enterprise Advanced Application)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

备忘录1【java环境变量手动更改】

B站视屏链接:https://www.bilibili.com/video/BV1cV8BeCESA?vd_source3e4562475feb55327a8adde111050d4e 1.电脑设置 2.系统-------系统信息 3.高级系统设置 4.环境变量 5.系统变量中,更改之前创建好的JAVA_HOME 版本可以将1.8改成本机安装的其他版本…

Java进阶13讲__第九讲

Stream流 1. 案例初体验 package cn.hdc.oop9.stream.using;import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream;public class t1 {public static void main(String[] args) {LinkedList<String&g…

认知杂谈30

今天分享 有人说的一段争议性的话 I I 《豁然开朗&#xff1a;男性成长的关键转折》 在男人的人生旅程当中啊&#xff0c;最金贵的可不是那些让人眼馋的钱财啥的&#xff0c;也不是啥惊天动地的事儿&#xff0c;更不是偶尔碰到的贵人帮忙。真正无价的宝贝呢&#xff0c;是在…

培训第四十一天(docker-compose一键部署项目,haproxy容器代理多个web或java容器)

# 创建脚本&#xff0c;可以在java环境中运行任何的jar包或者war包#!/bin/bash/usr/local/jdk/bin/java -jar /java/src/*.?ar 一、思路分析&#xff1a; &#xff08;1&#xff09;nginx 1、下载镜像&#xff0c;将本地的dist项目的目录挂载在容器的/usr/share/nginx/html…

论文解读:Visual Prompt Tuning

Comment: ECCV2022 摘要 当前调整预训练模型的方法需要更新backbone的全部参数&#xff0c;即完全微调。本文提出了一种高效的方法VPT&#xff0c;成为视觉中大规模transformer模型完全微调的替代方案。从微调大规模语言模型中吸取经验&#xff0c;VPT仅在输入空间中引入少数…

【C语言】通讯录的实现(详解)

通讯录的实现 主要用到的知识&#xff1a; 1.结构体相关知识 2.枚举 3.多文件 在学习完结构体和枚举后就可以利用学过的知识去实现一个通讯录了 1.通讯录要求 用C语言所学知识实现下面这样一个通讯录 1.通讯录100个联系人 2.姓名 性别 年龄 电话 地址 3.添加联系人 4.删除指…

SQL server数据库实现远程跨服务器定时同步传输数据

项目背景 公司新建项目&#xff0c;需要访问生产数据&#xff0c;但是规定不能直接访问生产数据库服务器&#xff0c;所以得考虑通过中间库的形式实现。经过评估项目需求 &#xff0c;以及当前拥有的环境。 需求&#xff1a; 1.用户不需要实时获取生产数据 2.用户只需要指定的…

Python青少年简明教程:函数

Python青少年简明教程&#xff1a;函数 在Python中&#xff0c;函数是一段可重用的代码块&#xff0c;用于执行特定的任务。函数能够接受输入参数&#xff0c;执行特定的操作&#xff0c;并返回结果。 Python提供了许多内置函数&#xff0c;如print()、len()、eval()等&#x…

Java基于微信小程序的校园兼职小程序

博主介绍&#xff1a;✌stormjun、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

shadertoy-sdf 操作

vec3 col getBackgroundColor(uv); float d1 sdCircle(uv, 0.1, vec2(0., 0.)); float d2 sdSquare(uv, 0.1, vec2(0.15, 0));float res; // result1、union res min(d1, d2); // union2、intersection res max(d1, d2); // intersection3、subtraction res max(-d1, d…

Python实战案例数据合并订单表和商品价格表数据

有如下数据&#xff0c;订单表和商品价格表&#xff0c;进行数据合并&#xff0c;输出客户需要的效果。 数据样例&#xff1a;&#x1f447; 订单表: 商品价格表: 最终效果&#xff1a; 01实现思路 目的是将订单数据和商品价格数据按照商品id和时间进行匹配&#xff0c;以…

基于nodejs+vue+uniapp的学习资料销售平台小程序

开发语言&#xff1a;Nodejs框架&#xff1a;expressuniapp数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;VS Code 系统展示 管理员登录 管理员主界面 用户管理 学习资料管理 订单管理 系统管理 用户…

未来已来:2024年远程控制行业的新星工具推荐

个人用户对于设备管理的便捷需求&#xff0c;远程控制软件都以其独特的优势&#xff0c;搭建起一座座沟通的桥梁。今天&#xff0c;我们就来探索一款集高效性、安全性与易用性于一体的远程控制软件。为了软件得到的方便我会介绍比如能从向日葵远程控制官网、TD官网、GH官网能直…

用RPC Performance Inspector 优化你的区块链

目录 什么是RPC&#xff1f; RPC Performance Inspector 是做什么的&#xff1f; 为什么需要这个工具&#xff1f; 如何使用它&#xff1f; 适合谁用&#xff1f; 如何使用&#xff1f; 什么是RPC&#xff1f; RPC Performance Inspector 是一个专门用于测试和分析RPC性能…

C语言 动态内存管理 #动态内存函数的介绍 #常见的动态内存错误 #C\C++ 程序的内存开辟 #柔性数组

文章目录 前言 一、为什么存在动态内存分配 二、动态内存函数的介绍 1、malloc 2、free 3、calloc 4、realloc realloc 的工作原理&#xff1a; 三、常见的动态内存错误 1、对NULL指针的解引用操作 2、对动态开辟空间的越界访问 3、对非动态开辟的空间使用 free 来释…

数学建模强化宝典(8)粒子群算法

前言 粒子群算法&#xff08;Particle Swarm Optimization, PSO&#xff09;是一种基于群体智能的优化算法&#xff0c;它源于对鸟群捕食行为的研究。通过模拟鸟群中的个体相互协作和信息共享来寻找最优解&#xff0c;粒子群算法已被广泛应用于函数优化、神经网络训练、模糊系统…

跨地域工作利器:深度解析2024年远程控制软件的新特性

无论是跨地域的团队协作、技术支持&#xff0c;使用远程控制工具可以让距离不再是障碍。这次我介绍一些可以直接下载使用的远程工具&#xff0c;比如从向日葵远程控制官网&#xff0c;EV官网、TV官网等就能直接下载使用的工具。 1.向日葵远程控制 链接直通车&#xff1a;http…

微服务--Nacos

一、Nacos简介 Nacos&#xff08;Naming and Configuration Service&#xff09;是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它致力于帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos支持几乎所有主流类型的服…

惠中科技智能高效综合光伏清洗技术

惠中科技综合光伏清洗技术&#xff1a;&#xff0c;引领绿色清洁新时代 随着全球对可再生能源需求的不断增长&#xff0c;光伏产业作为绿色能源的重要组成部分&#xff0c;正迎来前所未有的发展机遇。然而&#xff0c;光伏电站的广泛应用也带来了光伏板清洁维护的挑战。灰尘、…