OpenCV(6):图像边缘检测
图像边缘检测是计算机视觉和图像处理中的一项基本任务,它用于识别图像中亮度变化明显的区域,这些区域通常对应于物体的边界。是 OpenCV 中常用的边缘检测函数及其说明:
| 函数 | 算法 | 说明 | 适用场景 |
|---|---|---|---|
cv2.Canny() | Canny 边缘检测 | 多阶段算法,检测效果较好,噪声抑制能力强。 | 通用边缘检测,适合大多数场景。 |
cv2.Sobel() | Sobel 算子 | 基于一阶导数的边缘检测,可以检测水平和垂直边缘。 | 检测水平和垂直边缘。 |
cv2.Scharr() | Scharr 算子 | Sobel 算子的改进版本,对边缘的响应更强。 | 检测细微的边缘。 |
cv2.Laplacian() | Laplacian 算子 | 基于二阶导数的边缘检测,对噪声敏感。 | 检测边缘和角点。 |
1 Canny 边缘检测 (cv2.Canny())
Canny 边缘检测是一种多阶段的边缘检测算法,由 John F. Canny 在 1986 年提出。Canny 边缘检测被认为是边缘检测的"金标准",因为它能够在噪声抑制和边缘定位之间取得良好的平衡。
1.1 Canny 边缘检测的步骤
Canny 边缘检测算法主要包括以下几个步骤:
- 噪声抑制:使用高斯滤波器对图像进行平滑处理,以减少噪声的影响。
- 计算梯度:使用 Sobel 算子计算图像的梯度幅值和方向。
- 非极大值抑制:沿着梯度方向,保留局部梯度最大的像素点,抑制其他像素点。
- 双阈值检测:使用两个阈值(低阈值和高阈值)来确定真正的边缘。高于高阈值的像素点被认为是强边缘,低于低阈值的像素点被抑制,介于两者之间的像素点如果与强边缘相连则保留。
- 边缘连接:通过滞后阈值处理,将弱边缘与强边缘连接起来,形成完整的边缘。
1.2 使用 OpenCV 实现 Canny 边缘检测
在 OpenCV 中,可以使用 cv2.Canny() 函数来实现 Canny 边缘检测。该函数的原型如下:
edges = cv2.Canny(image, threshold1, threshold2, apertureSize=3, L2gradient=False)
image:输入图像,必须是单通道的灰度图像。threshold1:低阈值。threshold2:高阈值。apertureSize:Sobel 算子的孔径大小,默认为 3。L2gradient:是否使用 L2 范数计算梯度幅值,默认为 False(使用 L1 范数)。
import cv2# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 应用 Canny 边缘检测
edges = cv2.Canny(image, 100, 200)# 显示结果
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

2 Sobel 算子 (cv2.Sobel())
Sobel 算子是一种基于梯度的边缘检测算子,它通过计算图像在水平和垂直方向上的梯度来检测边缘。Sobel 算子结合了高斯平滑和微分操作,因此对噪声具有一定的抑制作用。
2.1 Sobel 算子的原理
Sobel 算子使用两个 3x3 的卷积核分别计算图像在水平和垂直方向上的梯度:
- 水平方向的卷积核:
[-1, 0, 1] [-2, 0, 2] [-1, 0, 1]
- 垂直方向的卷积核:
[-1, -2, -1] [ 0, 0, 0] [ 1, 2, 1]
通过这两个卷积核,可以分别得到图像在水平和垂直方向上的梯度 Gx 和 Gy。最终的梯度幅值可以通过以下公式计算:
G = sqrt(Gx^2 + Gy^2)
2.2 使用 OpenCV 实现 Sobel 算子
在 OpenCV 中,可以使用 cv2.Sobel() 函数来计算图像的梯度。该函数的原型如下:
dst = cv2.Sobel(src, ddepth, dx, dy, ksize=3, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
src:输入图像。ddepth:输出图像的深度,通常使用cv2.CV_64F。dx:x 方向上的导数阶数。dy:y 方向上的导数阶数。ksize:Sobel 核的大小,默认为 3。scale:缩放因子,默认为 1。delta:可选的 delta 值,默认为 0。borderType:边界填充类型,默认为cv2.BORDER_DEFAULT。
import cv2
import numpy as np# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 计算 x 方向的梯度
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)# 计算 y 方向的梯度
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)# 计算梯度幅值
sobel_combined = np.sqrt(sobel_x ** 2 + sobel_y ** 2)# 显示结果
cv2.imshow('Sobel X', sobel_x)
cv2.imshow('Sobel Y', sobel_y)
cv2.imshow('Sobel Combined', sobel_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()

3 Scharr算子(cv2.Scharr())
3.1 Scharr算子的原理
在离散的空间上,有很多方法可以用来计算近似导数,在使用 3×3 的 Sobel 算子时,可能计算结果并不太精准。OpenCV 提供了 Scharr 算子,该算子具有和 Sobel 算子同样的速度,且精度更高。可以将 Scharr 算子看作对 Sobel 算子的改进,其核通常为:

3.2 使用 OpenCV 实现 Scharr 算子
OpenCV 提供了函数 cv2.Scharr()来计算 Scharr 算子,其语法格式如下:
dst = cv2.Scharr( src, ddepth, dx, dy[, scale[, delta[, borderType]]] )
- dst 代表输出图像。
- src 代表原始图像。
- ddepth 代表输出图像深度。该值与函数 cv2.Sobel()中的参数 ddepth 的含义相同。
- dx 代表 x 方向上的导数阶数。
- dy 代表 y 方向上的导数阶数。
- scale 代表计算导数值时的缩放因子,该项是可选项,默认值是 1,表示没有缩放。
- delta 代表加到目标图像上的亮度值,该项是可选项,默认值为 0。
- borderType 代表边界样式。
import cv2# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 计算 x 方向的梯度
scharr_x = cv2.Scharr(image, cv2.CV_64F, 1, 0)# 计算 y 方向的梯度
scharr_y = cv2.Scharr(image, cv2.CV_64F, 0, 1)# 计算梯度幅值
scharr_combined = cv2.addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0)# 显示结果
cv2.imshow('Scharr X', scharr_x)
cv2.imshow('Scharr Y', scharr_y)
cv2.imshow('Scharr Combined', scharr_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()

4 Laplacian 算子 (cv2.Laplacian())
Laplacian 算子是一种二阶微分算子,它通过计算图像的二阶导数来检测边缘。Laplacian 算子对噪声比较敏感,因此通常在使用之前会对图像进行高斯平滑处理。
4.1 Laplacian 算子的原理
Laplacian 算子使用以下卷积核来计算图像的二阶导数:
[ 0, 1, 0] [ 1, -4, 1] [ 0, 1, 0]
通过这个卷积核,可以得到图像的 Laplacian 值。Laplacian 值较大的区域通常对应于图像的边缘。
4.2 使用 OpenCV 实现 Laplacian 算子
在 OpenCV 中,可以使用 cv2.Laplacian() 函数来计算图像的 Laplacian 值。该函数的原型如下:
dst = cv2.Laplacian(src, ddepth, ksize=1, scale=1, delta=0, borderType=cv2.BORDER_DEFAULT)
src:输入图像。ddepth:输出图像的深度,通常使用cv2.CV_64F。ksize:Laplacian 核的大小,默认为 1。scale:缩放因子,默认为 1。delta:可选的 delta 值,默认为 0。borderType:边界填充类型,默认为cv2.BORDER_DEFAULT。
import cv2# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 应用 Laplacian 算子
laplacian = cv2.Laplacian(image, cv2.CV_64F)# 显示结果
cv2.imshow('Laplacian', laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()

5 常用边缘检测函数对比
| 函数 | 算法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
cv2.Canny() | Canny 边缘检测 | 噪声抑制能力强,边缘检测效果好。 | 参数调节较为复杂。 | 通用边缘检测,适合大多数场景。 |
cv2.Sobel() | Sobel 算子 | 计算简单,适合检测水平和垂直边缘。 | 对噪声敏感,边缘检测效果一般。 | 检测水平和垂直边缘。 |
cv2.Scharr() | Scharr 算子 | 对边缘的响应更强,适合检测细微边缘。 | 对噪声敏感。 | 检测细微的边缘。 |
cv2.Laplacian() | Laplacian 算子 | 可以检测边缘和角点。 | 对噪声非常敏感。 | 检测边缘和角点。 |
相关文章:
OpenCV(6):图像边缘检测
图像边缘检测是计算机视觉和图像处理中的一项基本任务,它用于识别图像中亮度变化明显的区域,这些区域通常对应于物体的边界。是 OpenCV 中常用的边缘检测函数及其说明: 函数算法说明适用场景cv2.Canny()Canny 边缘检测多阶段算法,检测效果较…...
spark的一些指令
一,复制和移动 1、复制文件 格式:cp 源文件 目标文件 示例:把file1.txt 复制一份得到file2.txt 。那么对应的命令就是:cp file1.txt file2.txt 2、复制目录 格式:cp -r 源文件 目标文件夹 示例:把目…...
OpenHarmony全球化子系统
OpenHarmony全球化子系统 简介系统架构目录相关仓 简介 当OpenHarmony系统/应用在全球不同区域使用时,系统/应用需要满足不同市场用户关于语言、文化习俗的需求。全球化子系统提供支持多语言、多文化的能力,包括: 资源管理能力 根据设备类…...
创建私人阿里云docker镜像仓库
步骤1、登录阿里云 阿里云创建私人镜像仓库地址:容器镜像服务 步骤2、创建个人实例 步骤:【实例列表】 》【创建个人实例】 》【设置Registry登录密码】 步骤3、创建命名空间 步骤:【个人实例】》【命名空间】》【创建命名空间】 注意&am…...
【LLM】本地部署LLM大语言模型+可视化交互聊天,附常见本地部署硬件要求(以Ollama+OpenWebUI部署DeepSeekR1为例)
【LLM】本地部署LLM大语言模型可视化交互聊天,附常见本地部署硬件要求(以OllamaOpenWebUI部署DeepSeekR1为例) 文章目录 1、本地部署LLM(以Ollama为例)2、本地LLM交互界面(以OpenWebUI为例)3、本…...
【考研】复试相关上机题目
文章目录 22机试回忆版1、判断燃气费描述输入格式输出格式输入样例输出样例 C o d e Code Code 2、统计闰年数量描述输入格式输出格式输入样例输出样例 C o d e Code Code 3、打印图形描述输入格式输出格式 C o d e Code Code 4、密文数据描述输入格式输出格式输入样例输出样例…...
vue3除了pinia/vuex的其他通讯方式还有那些
1. Props 和 Events Props:父组件通过 props 向子组件传递数据。 Events:子组件通过 $emit 向父组件发送事件。 <!-- ParentComponent.vue --> <template><ChildComponent :message"parentMessage" update-message"updat…...
【Python爬虫(80)】当Python爬虫邂逅边缘计算:探索数据采集新境界
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
LLM之论文阅读——Context Size对RAG的影响
前言 RAG 系统已经在多个行业中得到广泛应用,尤其是在企业内部文档查询等场景中。尽管 RAG 系统的应用日益广泛,关于其最佳配置的研究却相对缺乏,特别是在上下文大小、基础 LLM 选择以及检索方法等方面。 论文原文: On the Influence of Co…...
2025-02-25 学习记录--C/C++-用C语言实现删除字符串中的子串
用C语言实现删除字符串中的子串 在C语言中,你可以使用strstr函数来查找子串,然后用memmove或strcpy来覆盖或删除找到的子串。 一、举例 🐰 #include <stdio.h> // 包含标准输入输出库,用于使用 printf 函数 #include <s…...
网络原理--常见的请求和响应的格式
1.xml 类似于html,也是一种标签语言,标签成对出现。 例如: <request> <userId>1000</userId> </request> 其中: <userId>称为开始标签,</userId>称为结束标签。开始标签和结…...
【Linux】Ubuntu服务器的安装和配置管理
ℹ️大家好,我是练小杰,今天周二了,哪吒的票房已经到了138亿了,饺子导演好样的!!每个人的成功都不是必然的,坚信自己现在做的事是可以的!!😆 本文是有关Ubunt…...
2.3做logstash实验
收集apache日志输出到es 在真实服务器安装logstash,httpd systemctl start httpd echo 666 > /var/www/html/index.html cat /usr/local/logstash/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns/httpd #系统内置变量 cd /usr/local/…...
pandas读取数据
pandas读取数据 导入需要的包 import pandas as pd import numpy as np import warnings import oswarnings.filterwarnings(ignore)读取纯文本文件 pd.read_csv 使用默认的标题行、逗号分隔符 import pandas as pd fpath "./datas/ml-latest-small/ratings.csv" 使…...
rabbitmq 延时队列
要使用 RabbitMQ Delayed Message Plugin 实现延时队列,首先需要确保插件已安装并启用。以下是实现延时队列的步骤和代码示例。 1. 安装 RabbitMQ Delayed Message Plugin 首先,确保你的 RabbitMQ 安装了 rabbitmq-delayed-message-exchange 插件。你可…...
Deepseek 实战全攻略,领航科技应用的深度探索之旅
想玩转 Deepseek?这攻略别错过!先带你了解它的基本原理,教你搭建运行环境。接着给出自然语言处理、智能客服等应用场景的实操方法与代码。还分享模型微调、优化技巧,结合案例加深理解,让你全面掌握,探索科技…...
Go语言中的信号量:原理与实践指南
Go语言中的信号量:原理与实践指南 引言 在并发编程中,控制对共享资源的访问是一个经典问题。Go语言提供了丰富的并发原语(如sync.Mutex),但当我们需要灵活限制并发数量时,信号量(Semaphore&am…...
计算机网络与通讯知识总结
计算机网络与通讯知识总结 基础知识总结 1)FTP:文件传输 SSH:远程登录 HTTP:网址访问 2)交换机 定义:一种基于MAC地址实现局域网(LAN)内数据高速转发的网络设备,可为接入设备提供独享通信通道。 - 核心功能: 1.数据链路层(OSI第二层)工作,通过MAC地址…...
ReentrantLock 用法与源码剖析笔记
📒 ReentrantLock 用法与源码剖析笔记 🚀 一、ReentrantLock 核心特性 🔄 可重入性:同一线程可重复获取锁(最大递归次数为 Integer.MAX_VALUE)🔧 公平性:支持公平锁(按等…...
Vscode无法加载文件,因为在此系统上禁止运行脚本
1.在 vscode 终端执行 get-ExecutionPolicy 如果返回是Restricted,说明是禁止状态。 2.在 vscode 终端执行set-ExecutionPolicy RemoteSigned 爆红说明没有设置成功 3.在 vscode 终端执行Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 然后成功后你再在终…...
java进阶专栏的学习指南
学习指南 java类和对象java内部类和常用类javaIO流 java类和对象 类和对象 java内部类和常用类 java内部类精讲Object类包装类的认识String类、BigDecimal类初探Date类、Calendar类、SimpleDateFormat类的认识java Random类、File类、System类初识 javaIO流 java IO流【…...
架构思维:架构的演进之路
文章目录 引言为什么架构思维如此重要架构师的特点软件架构的知识体系如何提升架构思维大型互联网系统架构的演进之路一、大型互联网系统的特点二、系统处理能力提升的两种途径三、大型互联网系统架构演化过程四、总结 引言 在软件开发行业中,有很多技术人可能会问…...
VC++零基础入门之系列教程 【附录E MFC快速参考指南】
附录E MFC快速参考指南 E.1 创建窗口 使用M F C CWnd wnd; W n d . C r e a t e E x ( E xSt y l e , C l a s s N a m e , Wi n d o w N a m e , S t y l e , x , y, Wi d t h , H e i g h t , P a r e n t , M e n u , P a r a m ) ; 使用A P I HWND hwnd=::CreateWi n d …...
vue3:vue3项目安装并引入Element-plus
一、安装Element-plus 1、安装语句位置 安装 | Element Plushttps://element-plus.org/zh-CN/guide/installation.html根据所需进行安装,这里使用npm包 2、找到项目位置 找到项目位置,在路径上输入cmd回车打开“运行”窗口 输入安装语句回车完成安装 …...
一文掌握python中正则表达式的各种使用
文章目录 1. 正则表达式基础1.1 常用元字符1.2 基本用法 2. 正则表达式高级功能2.1 分组捕获2.2 命名分组2.3 非贪婪匹配2.4 零宽断言2.5 编译正则表达式2.6 转义字符 3. 常见应用场景3.1 验证邮箱格式3.2 提取 URL3.3 提取日期3.4 提取HTML中的链接3.5 提取HTML中的图片链接3.…...
java.2.25
1. 注释 注释是对代码的解释和说明文字。 Java中的注释分为三种: 单行注释: // 这是单行注释文字多行注释: /* 这是多行注释文字 这是多行注释文字 这是多行注释文字 */ 注意:多行注释不能嵌套使用。文档注释:…...
45.matlab产生正弦叠加信号
,...
VScode 开发
目录 安装 VS Code 创建一个 Python 代码文件 安装 VS Code VSCode(全称:Visual Studio Code)是一款由微软开发且跨平台的免费源代码编辑器,VSCode 开发环境非常简单易用。 VSCode 安装也很简单,打开官网 Visual S…...
在llm和agent的背景下,有什么比较好的研究方向或者能解决现在的实际的社会问题
在llm和agent的背景下,有什么比较好的研究方向或者能解决现在的实际的社会问题 在LLM(大语言模型)与Agent(智能体)的融合背景下,研究方向和社会应用正呈现出多元化趋势。 一、技术研究方向 多模态智能体(Multi-modal Agents) 方向:将LLM与视觉、语音、触觉等多模态数…...
A Large Recurrent Action Model: xLSTM Enables Fast Inference for Robotics Tasks
奥地利林茨约翰开普勒大学机器学习研究所 ELLIS 小组,LIT 人工智能实验室奥地利林茨 NXAI 有限公司谷歌 DeepMind米拉 - 魁北克人工智能研究所 摘要 近年来,强化学习(Reinforcement Learning, RL)领域出现了一种趋势,…...
