当前位置: 首页 > news >正文

边缘检测运用

文章目录

  • 一、简介
    • 1.边缘检测的概念
    • 2.边缘检测的目的
  • 二、代码实现
  • 三、边缘检测的方法
    • 1.1Canny边缘检测器
    • 1.2.Canny代码实现
    • 2.1Sobel边缘检测器
    • 2.2Sobel代码实现
    • 3.1Laplacian边缘检测器
    • 3.2Laplacian代码实现
    • 4.1Scharr边缘检测器
    • 4.2Scharr代码实现
  • 四、边缘检测的应用

一、简介

边缘检测是图像处理和计算机视觉中的一个基本问题,旨在标识数字图像中亮度变化明显的点,即检测图像中的边缘或不连续区域。这些边缘通常反映了图像中不同区域之间的边界或过渡区域,包含了物体的轮廓和结构信息。

1.边缘检测的概念

边缘检测是图像处理中的一个重要步骤,它通过检测图像中颜色、亮度或纹理的突然变化,提取出图像的边缘信息。这些边缘信息对于理解图像结构、提取重要特征以及进行目标识别、图像分割等后续处理至关重要。

2.边缘检测的目的

边缘检测的主要目的是捕捉图像中亮度急剧变化的区域,这些区域往往代表了图像中的重要信息,如物体的轮廓、纹理边界等。通过边缘检测,可以大幅度减少图像的数据量,并剔除不相关的信息,从而保留图像的重要结构属性。

二、代码实现

yuan = cv2.imread('yuan.png')
cv2.imshow('yuan',yuan)
cv2.waitKey(0)
# x方向上的边缘检测
yuan_x = cv2.Sobel(yuan,-1,dx=1,dy=0)
cv2.imshow('yuan_x',yuan_x)
cv2.waitKey(0)

x方向上的边缘检测:使用cv2.Sobel()函数进行x方向(水平方向)的边缘检测。-1表示输出图像与原图像相同的深度(但在这种情况下,如果原图像是8位无符号整数,输出可能会因为截断而丢失信息),dx=1和dy=0指定了x方向上的导数。显示x方向边缘检测的结果。

# x方向上的边缘,包括负数信息(右端),但显示不出来,因为范围是(0-255)
yuan_x_64 = cv2.Sobel(yuan,cv2.CV_64F,dx=1,dy=0)
cv2.imshow('yuan_x_64',yuan_x_64)
cv2.waitKey(0)

x方向边缘检测,保留负数信息:使用cv2.CV_64F作为输出图像的深度,这样可以保留边缘检测中的负数信息。

# x 方向的边缘,包括负数信息(右端),进行取绝对值操作,右端的负值信息可以显示
yuan_x_full = cv2.convertScaleAbs(yuan_x_64)
cv2.imshow('yuan_x_full',yuan_x_full)
cv2.waitKey(0)

取绝对值并显示x方向边缘:使用cv2.convertScaleAbs()函数将yuan_x_64中的所有值取绝对值,并转换为8位无符号整数以便显示。

# y方向上的边缘检测
yuan_y = cv2.Sobel(yuan,-1,dx=0,dy=1)
cv2.imshow('yuan_y',yuan_y)
cv2.waitKey(0)
# y方向上的边缘,包括负数信息(下端),但显示不出来,因为范围是(0-255)
yuan_y_64 = cv2.Sobel(yuan,cv2.CV_64F,dx=0,dy=1)
yuan_y_full = cv2.convertScaleAbs(yuan_y_64)
cv2.imshow('yuan_y_64',yuan_y_64)
cv2.imshow('yuan_y_full',yuan_y_full)
cv2.waitKey(0)

y方向上的边缘检测:与x方向类似,但使用dy=1进行y方向(垂直方向)的边缘检测。

# x,y方向上的边缘检测
yuan_xy = cv2.Sobel(yuan,-1,dx=1,dy=1)
cv2.imshow('yuan_xy',yuan_xy)
cv2.waitKey(0)
# 使用图像加权运算组合x和y方向的2个边缘
yuan_xy_full = cv2.addWeighted(yuan_x_full,1,yuan_y_full,1,0)
cv2.imshow('yuan_xy_full',yuan_xy_full)
cv2.waitKey(0)

x,y方向上的边缘检测(结合):使用cv2.addWeighted()函数将x和y方向上的边缘检测结果进行加权组合。这里两个方向的权重都是1,意味着它们被等权重地组合在一起。

三、边缘检测的方法

边缘检测的方法多种多样,但大体上可以分为基于查找和基于零穿越的两类。基于查找的方法通过寻找图像一阶导数中的最大和最小值来检测边界,而基于零穿越的方法则通过寻找图像二阶导数零穿越来寻找边界。以下是一些常用的边缘检测算法:

1.1Canny边缘检测器

Canny算法是一种多级边缘检测算法,它首先使用高斯滤波器平滑图像以减少噪声,然后计算图像的梯度幅度和方向,接着通过非极大值抑制来细化边缘,并使用双阈值检测和边缘连接来最终确定边缘。Canny算法被认为是边缘检测的标准算法之一,因为它能够检测到良好的边缘并且错误率较低。

1.2.Canny代码实现

jijia = cv2.imread('2.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('jijia',jijia)
cv2.waitKey(0)
jijia_canny =  cv2.Canny(jijia,100,150)
cv2.imshow('jijia_canny',jijia_canny)
cv2.waitKey(0)

在这里插入图片描述

使用cv2.Canny()函数对灰度图像jijia进行边缘检测。Canny边缘检测是一种流行的边缘检测算法,它使用两个阈值(在这里是100和150)来检测图像中的强边缘和弱边缘,并通过连接这些边缘来形成连续的边界。
第一个阈值(100)是较低的阈值,用于检测边缘的初步候选。
第二个阈值(150)是较高的阈值,用于检测确定的边缘。
边缘检测算法会首先使用较低的阈值找到尽可能多的边缘,然后使用较高的阈值来找到其中的强边缘。最后,它会根据强边缘来连接弱边缘,从而生成最终的边缘图像。

2.1Sobel边缘检测器

Sobel算法使用两个3x3的卷积核(一个用于检测水平边缘,另一个用于检测垂直边缘)来估计图像的一阶导数。然后,通过计算这些导数的平方和的平方根来得到每个像素的边缘强度。Sobel算法对噪声有一定的平滑作用,但可能会检测到一些非边缘的像素点。

2.2Sobel代码实现

jijia = cv2.imread('2.png',cv2.IMREAD_GRAYSCALE)
jijia_x_64= cv2.Sobel(jijia,cv2.CV_64F,dx=1,dy=0)
jijia_x_full = cv2.convertScaleAbs(jijia_x_64)
jijia_y_64 = cv2.Sobel(jijia,cv2.CV_64F,dx=0,dy=1)
jijia_y_full = cv2.convertScaleAbs(jijia_y_64)
jijia_xy_sobel_full = cv2.addWeighted(jijia_x_full,1,jijia_y_full,1,0)
cv2.imshow('jijia_xy_sobel_full',jijia_xy_sobel_full)
cv2.waitKey(0)

在这里插入图片描述
使用Sobel算子在x、y方向上进行边缘检测 ,这里设置dx, dy表示检测该方向方向上的边缘。将边缘检测的结果转换为8位无符号整数图像。使用加权和将x方向和y方向上的边缘检测结果进行组合 ,显示组合后的边缘图像 。

3.1Laplacian边缘检测器

LoG算法首先使用高斯滤波器对图像进行平滑处理,然后计算图像的拉普拉斯算子(二阶导数)。由于拉普拉斯算子对边缘敏感,因此可以通过检测拉普拉斯算子的零交叉点来找到边缘。LoG算法能够检测到较细的边缘,并且对噪声有一定的抑制作用。

3.2Laplacian代码实现

jijia = cv2.imread('2.png',cv2.IMREAD_GRAYSCALE)
jijia_lap = cv2.Laplacian(jijia,cv2.CV_64F)
jijia_lap_full = cv2.convertScaleAbs(jijia_lap)
cv2.imshow('jijia_lap_full',jijia_lap_full)
cv2.waitKey(0)

在这里插入图片描述

使用Laplacian算子进行边缘检测,cv2.Laplacian 函数需要两个参数:源图像和输出图像的深度,这里设置输出图像的深度为cv2.CV_64F,即64位浮点数,将Laplacian算子的结果转换为8位无符号整数图像以便显示,显示转换后的边缘图像。

4.1Scharr边缘检测器

Scharr算子与Sobel算子类似,但它在计算梯度时使用了不同的系数。Scharr算子对于检测边缘更加敏感,因此在某些情况下可能会得到更清晰的边缘结果。

4.2Scharr代码实现

jijia = cv2.imread('2.png',cv2.IMREAD_GRAYSCALE)
jijia_x_64 = cv2.Scharr(jijia,cv2.CV_64F,dx=1,dy=0)
jijia_x_full = cv2.convertScaleAbs(jijia_x_64)
jijia_y_64 = cv2.Scharr(jijia,cv2.CV_64F,dx=0,dy=1)
jijia_y_full = cv2.convertScaleAbs(jijia_y_64)
jijia_xy_Scharr_full = cv2.addWeighted(jijia_y_full,1,jijia_y_full,1,0)
cv2.imshow('jijia_xy_Scharr_full',jijia_xy_Scharr_full)
cv2.waitKey(0)

在这里插入图片描述

使用Scharr算子在x,y方向上进行边缘检测,Scharr算子通常比Sobel算子提供更精确的边缘检测结果 。将边缘检测的结果转换为8位无符号整数图像以便显示,使用加权和将x方向和y方向上的边缘检测结果进行组合,显示组合后的边缘图像。

四、边缘检测的应用

边缘检测在图像处理、计算机视觉和机器视觉等领域具有广泛的应用。以下是一些典型的应用场景:

  • 目标检测与识别:通过边缘检测可以提取出图像中物体的轮廓和形状信息,从而实现目标的检测和识别。
  • 图像分割:边缘检测是图像分割的重要步骤之一,通过检测图像中的边缘可以将图像划分为不同的区域或对象。
  • 图像增强:边缘检测可以用于图像增强处理,通过突出图像中的边缘信息使图像更加清晰和易于理解。
  • 视频分析:在视频分析中,边缘检测可以用于目标的跟踪和运动分析等任务。

总之,边缘检测是图像处理和计算机视觉中的一个重要环节,它通过检测图像中的边缘信息为后续的图像处理和分析提供了重要的基础。随着技术的不断发展,边缘检测算法也在不断演进和完善以满足各种应用场景的需求。

相关文章:

边缘检测运用

文章目录 一、简介1.边缘检测的概念2.边缘检测的目的 二、代码实现三、边缘检测的方法1.1Canny边缘检测器1.2.Canny代码实现2.1Sobel边缘检测器2.2Sobel代码实现3.1Laplacian边缘检测器3.2Laplacian代码实现4.1Scharr边缘检测器4.2Scharr代码实现 四、边缘检测的应用 一、简介 …...

应用宝自动下载安装

import uiautomator2 as u2 from threading import Thread import logging import sys import os loggerlogging.getLogger("uiautomator2") logger.setLevel(logging.INFO) d u2.connect()"""下载模块""" class yingyongbao(object…...

Vue 2 中实现双击事件的几种方法

在 Vue 2 中处理用户交互,特别是双击事件,是一个常见的需求。Vue 提供了一种简洁的方式来绑定事件,包括双击事件。本文将介绍几种在 Vue 2 中实现双击事件的方法。 1. 使用 dblclick 指令 Vue 允许你直接在模板中使用 dblclick 指令来监听双…...

windows服务管理插件 nssm

NSSM是一个windows下服务管理插件,可以填加、删除、启动、停止服务 1.下载 官网:http://nssm.cc 下载页面:http://nssm.cc/download 直接下载:http://nssm.cc/release/nssm-2.24.zip 2.食用 以填加php8.2为例 2.1.将nssm.ex…...

【读书笔记-《30天自制操作系统》-19】Day20

本篇的内容围绕系统调用展开。为了让应用程序能够调用操作系统功能,引入了系统调用以及API的概念。首先实现了显示单个字符的API,让应用程序通过传递地址的方式进行调用;接下来又改进为通过中断的方式进行调用。在此基础上继续实现了显示字符…...

Kubernetes服务注册与发现

Kubernetes服务注册与发现 1、服务注册2、服务发现2.1 DNS服务发现2.2 环境变量(较少使用)💖The Begin💖点点关注,收藏不迷路💖 在Kubernetes中,服务注册与发现确保了Pod间的高效通信。 1、服务注册 当创建Service时,其信息被存储在Kubernetes的ETCD数据库中。Pod…...

【 html+css 绚丽Loading 】000047 玄武流转盘

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 &#x1f495…...

线程池原理及改造

目录 一 线程池执行原理 二 线程池改造(一) 三 线程池改造(二) 一 线程池执行原理 首先我们先了解一下线程池里面几个参数: 第一个是核心线程数,第二个是线程池最大线程数。(线程池里面的线程分为核心线程和非核心线程,既然核心…...

彻底理解mysql Buffer Pool (拓展)

彻底理解Buffer Pool (拓展) 一、Buffer Pool 的内存管理策略对数据库性能的影响 内存分配与回收:Buffer Pool 在申请内存时,需要考虑操作系统的内存分配策略。如果分配不合理,可能导致内存碎片,影响性能…...

信号量(二值信号量和计数信号量)和互斥量

信号量 信号量(Semaphore) 是一种实现任务间通信的机制, 可以实现任务之间同步或临界资源的互斥访问, 常用于协助一组相互竞争的任务来访问临界资源。 在多任务系统中, 各任务之间需要同步或互斥实现临界资源的保护&a…...

结构型模式-python版

在21种设计模式中, 结构型设计模式有7种, 分别是: 适配器模式代理模式桥接模式享元模式外观模式组合模式装饰器模式 下面逐一简要介绍: 1 适配器模式 适配器(Adapter)设计模式是一种结构型设计模式&…...

Java重修笔记 第五十四天 坦克大战(二)常用的绘图方法、画出坦克图形

常用的绘图方法 1.设置当前画笔的颜色,可多次调用 public abstract void setColor(Color c) 参数:c -颜色 2. 画一条直线 public abstract void drawLine(int x1, int y1, int x2, int y2) 参数:x1 - 第一个点的 x坐标。 y1 - 第一点的 y坐…...

OpenAI澄清:“GPT Next”不是新模型。

不,”GPT Next” 并不是OpenAI的下一个重要项目。 本周早些时候,OpenAI 日本业务的负责人长崎忠男在日本 KDDI 峰会上分享了一场演讲,似乎在暗示一个名为 “GPT Next” 的新模型即将出现。 但OpenAI的一位发言人已向Mashable证实&#xff0…...

<<编码>> 第 10 章 逻辑与开关(Logic and Switches) 示例电路

串联电路 info::操作说明 鼠标单击开关切换开合状态 需要两个开关同时闭合才能接通电路 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch10-01-series-circuit.txt 并联电路 in…...

深入浅出 Ansible 自动化运维:从入门到实战

在现代 IT 运维中,自动化是提升效率、降低错误率的关键。Ansible 作为一款流行的自动化工具,凭借其简洁的语法和强大的功能,成为了运维工程师的得力助手。本文将深入探讨 Ansible 的核心概念、实际应用以及一些实用的技巧,帮助你在…...

一句话描述设计模式

最近在看设计模式,其描述抽象程度令人欲罢不能,始终不得其意。于是尝试用一句话总结了一下,常规的就不说了,只是举了个例子。 单例模式 Spring中的单例bean使用了双重锁机制 工厂模式 Spring中的BeanFactory是简单工厂模式Bea…...

【Linux】Ubuntu 22.04 shell实现MySQL5.7 tar 一键安装

参考 https://blog.csdn.net/qq_35995514/article/details/134350572?spm1001.2014.3001.5501 在原作者基础上做了修改,加了一个删除原有mysql 的脚本 文章目录 一、安装下载**my.cnf 配置文件** 二、执行安装**install_mysql.sh 安装脚本**本机免密脚本 ssh_keyge…...

SQL Server开启网络访问

目前工作中很少用到SQL Server了,最近需要测试几个表,需要搭建一个SQL Server数据库服务,这里做个总结吧。 安装这里就不做详细介绍了,本文只介绍如何开启SQL Server网络访问。 1、云服务器安全组设置 如果是搭建在云服务器上&a…...

el-input设置type=‘number‘和v-model.number的区别

el-input设置typenumber’与设置.number修饰符的区别 1. 设置type‘number’ 使用el-input时想收集数字类型的数据,我们首先会想到typenumber,设置完type为number时会限制我们输入的内容只能为数字,不能为字符/汉字等非数字类型的数值&…...

6.第二阶段x86游戏实战2-理解程序流程

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…...

Netty笔记01-Netty的基本概念与用法

文章目录 1. 概述1.1 Netty 是什么?1.2 Netty 的特点1.3 Netty 的作者1.4 Netty 的地位1.5 Netty 的优势1.6 Netty 的工作原理1.7 Netty 的应用场景1.8 Netty 的重要组件 2. 第一个程序2.1 目标2.2 服务器端2.3 客户端2.4 流程梳理💡 提示 1. 概述 1.1 …...

OpenHarmony鸿蒙( Beta5.0)RTSPServer实现播放视频详解

鸿蒙开发往期必看: 一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发! “非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通) “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路…...

QT使用事件事件和绘制事件实现简易时钟

这个时钟实现的底层原理主要是利用 Qt 的绘图机制和定时器。首先,设置固定大小的窗口,创建定时器并连接到槽函数,定时器每秒钟触发一次,触发窗口重绘。在paintEvent函数中,使用QPainter进行绘图,绘制圆形表…...

kubeadm方式安装k8s

一、安装环境 环境准备:(有阿里云)centos7 k8s-master 192.168.1.11 k8s-node1 192.168.1.22 k8s-node2 192.168.1.33 二、前期准备 在k8s-master主机 [rootk8s-master ~]# vim /etc/hosts…...

如何使用go生成可执行文件

在 Go 中生成可执行文件非常简单。你可以使用 go build或者go install 命令。以下是步骤: 1. 步骤 1.1. 打开终端,导航到你的 Go 项目目录 确保你在包含 main 包的目录中,通常这是项目的根目录或包含 main.go 文件的目录。 1.2. 运行 go …...

手写Promise

构造器的实现 const PENDING pending; const FULFILLED fulfilled; const REJECTED rejectedclass MyPromise{#state PENDING;#result undefined;constructor(executor){const resolve (data) > {this.#changeState(FULFILLED, data);};const reject (reason) > …...

深度学习云服务器免费使用教程

#云服务器# #深度学习# #人工智能# #计算机视觉# 本文为各位学习深度学习的入门选手而创建,降低深度学习的入门门槛。 谷歌云服务器Colab: T4GPU。限额,需要科学上网,不能使用终端。 谷歌云服务器地址:欢迎使用 C…...

使用ansible的剧本制作salt-master与salt-minion的安装与启动服务过程

虚拟机版本:Rocky Linux release 8.6 (Green Obsidian) 准备几台虚拟机 ipv4地址主机名192.168.137.13center192.168.137.14sp-1192.168.137.15sp-2192.168.137.16sp-3 一、center主机的配置 1.vim /etc/hosts 127.0.0.1 localhost localhost.localdomain loc…...

数据库sqlite3

用数据库函数完成数据的增删改查 增: 将要存储的信息录入到结构体中,再使用snprintf函数信息结合sqlite3命令语句使用sqlite3_exec函数完成插入。 int do_insert(sqlite3 *ppDb) {Worker Work;printf("输入插入的工号:");scanf("%d&qu…...

开发基础之Python 函数(Basic Python Functions for Development)

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