OpenCV边缘检测方法详解

news2025/4/13 10:31:19

文章目录

  • 引言
  • 一、边缘检测基础概念
    • 边缘类型
  • 二、OpenCV中的边缘检测方法
    • 1. Sobel算子
    • 2. Scharr算子
    • 3. Laplacian算子
    • 4. Canny边缘检测
  • 三、性能比较与选择建议
  • 四、总结

引言

边缘检测是计算机视觉和图像处理中的基础技术,它能有效识别图像中物体的边界,为后续的特征提取、目标识别等任务奠定基础。本文将详细介绍OpenCV中常用的边缘检测方法及其实现。

一、边缘检测基础概念

边缘是图像中像素值发生显著变化的位置,通常对应着物体的边界、纹理变化或光照变化。边缘检测的目的是识别这些变化区域。

边缘类型

  1. 阶跃边缘:像素值突然变化(如黑白交界)
  2. 斜坡边缘:像素值逐渐变化
  3. 屋顶边缘:像素值先增加后减小

二、OpenCV中的边缘检测方法

1. Sobel算子

Sobel算子利用一阶导数检测边缘,分别计算水平和垂直方向的梯度。

sobel算子
cv2.Sobel(src, ddepth, dx, dy[, ksize[, scale[, delta[, borderType]]]])
参数:
src:输入图像
ddepth: 输出图像的深度(可以理解为数据类型),-1表示与原图像相同的深度
dx,dy:当组合为dx=1,dy=0时求x方向的一阶导数,
当组合为dx=0,dy=1时求y方向的一阶导数(如果同时为1,通常效果不佳)

ksize:(可选参数)Sobel算子的大小,必须是1,3,5或者7,默认为3

代码如下:

import cv2
import numpy as np

# 读取图像
zhaoyun = cv2.imread('zhaoyun1.jpg',0)
# Sobel边缘检测
zhaoyun_x_64 = cv2.Sobel(zhaoyun,cv2.CV_64F,dx=1,dy=0)# 水平方向
zhaoyun_x_full = cv2.convertScaleAbs(zhaoyun_x_64)
zhaoyun_y_64 = cv2.Sobel(zhaoyun,cv2.CV_64F,dx=0,dy=1)# 垂直方向
zhaoyun_y_full = cv2.convertScaleAbs(zhaoyun_y_64)

zhaoyun_xy_sobel_full = cv2.addWeighted(zhaoyun_x_full,1,zhaoyun_y_full,1,0)

cv2.imshow('zhaoyun',zhaoyun)
cv2.imshow('zhaoyun_xy_sobel_full',zhaoyun_xy_sobel_full)
cv2.waitKey(0)

运行结果如下:
左图为原图,右图是使用Sobel算子进行边缘检测后的图:
在这里插入图片描述

2. Scharr算子

Scharr是Sobel的改进版,对边缘的响应更强。

cv.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]])
src:输入图像
ddepth:输出图片的数据深度,由输入图像的深度进行选择
dx:x 轴方向导数的阶数
dy:y 轴方向导数的阶数

代码如下:

import cv2
import numpy as np
# 读取图像
zhaoyun = cv2.imread('zhaoyun.jpg',cv2.IMREAD_GRAYSCALE)
# Scharr边缘检测
zhaoyun_x_64 = cv2.Scharr(zhaoyun,cv2.CV_64F,dx=1,dy=0)
zhaoyun_x_full = cv2.convertScaleAbs(zhaoyun_x_64)
zhaoyun_y_64 = cv2.Scharr(zhaoyun,cv2.CV_64F,dx=0,dy=1)
zhaoyun_y_full = cv2.convertScaleAbs(zhaoyun_y_64)

zhaoyun_xy_Scharr_full = cv2.addWeighted(zhaoyun_x_full,1,zhaoyun_y_full,1,0)

cv2.imshow('zhaoyun_xy_Scharr_full',zhaoyun_xy_Scharr_full)
cv2.waitKey(0)

运行结果如下:
左图为原图,右图是使用Scharr算子进行边缘检测后的图:
在这里插入图片描述

3. Laplacian算子

Laplacian算子基于二阶导数,对噪声更敏感但能检测更细的边缘。

cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
参数说明:
src:输入图像,可以是灰度图像,也可以是多通道的彩色图像
ddepth:输出图片的数据深度:
ksize:计算二阶导数滤波器的孔径大小,必须为正奇数,可选项
scale:缩放比例因子,可选项,默认值为 1
delta:输出图像的偏移量,可选项,默认值为 0

代码如下:

# 读取图像
zhaoyun = cv2.imread('zhaoyun.jpg',cv2.IMREAD_GRAYSCALE)
# Laplacian算子
zhaoyun_lap = cv2.Laplacian(zhaoyun,cv2.CV_64F)
zhaoyun_lap_full  = cv2.convertScaleAbs(zhaoyun_lap)

cv2.imshow('zhaoyun_lap_full',zhaoyun_lap_full)
cv2.waitKey(0)

运行结果如下:
左图为原图,右图是使用 Laplacian算子进行边缘检测后的图:
在这里插入图片描述

4. Canny边缘检测

最常用的边缘检测算法,包含以下步骤:

  1. 高斯滤波去噪
  2. 计算梯度幅值和方向
  3. 非极大值抑制
  4. 双阈值检测
cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])
image 为输入图像。
threshold1 表示处理过程中的第一个阈值。fL
threshold2 表示处理过程中的第二个阈值。fH

代码如下:

# 读取图像
zhaoyun = cv2.imread('zhaoyun.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow('zhaoyun',zhaoyun)
cv2.waitKey(0)
# Canny边缘检测
zhaoyun_canny = cv2.Canny(zhaoyun,100,150)
cv2.imshow('zhaoyun_canny',zhaoyun_canny)
cv2.waitKey(0)

运行结果如下:
左图为原图,右图是使用 Canny边缘检测后的图:
在这里插入图片描述

三、性能比较与选择建议

方法优点缺点适用场景
Sobel计算简单,速度快对噪声敏感,边缘较粗实时应用,初步边缘检测
Scharr比Sobel精度更高计算量略大需要更精确边缘的场景
Laplacian能检测二阶导数边缘对噪声非常敏感需要精细边缘的场景
Canny边缘清晰完整,抗噪性好计算复杂,参数调整困难大多数通用边缘检测场景

四、总结

边缘检测是计算机视觉的基础操作,OpenCV提供了从传统算子到高级算法的完整实现。在实际应用中:

  1. 对于实时性要求高的场景,可选择Sobel或Scharr
  2. 需要精细边缘时,Laplacian是不错的选择
  3. 大多数情况下,Canny算法能提供最佳平衡
  4. 对于复杂场景,可考虑深度学习边缘检测方法

通过合理选择方法和参数调优,边缘检测技术可以广泛应用于工业检测、自动驾驶、医学影像分析等领域。

希望本文能帮助您理解和应用OpenCV中的边缘检测技术!

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

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

相关文章

Linux:shell运行原理+权限

1.shell的运行原理 如果我们打开了命令终端或者是xshell进行远程登录服务器,就会看到命令行,如下图所示: 这个命令行本身也是系统中一个运行起来的程序,它用来接收用户的输入,帮用户来执行指令,将运行结果展…

【LeetCode Solutions】LeetCode 160 ~ 165 题解

CONTENTS LeetCode 160. 相交链表(简单)LeetCode 162. 寻找峰值(中等)LeetCode 164. 最大间距(中等)LeetCode 165. 比较版本号(中等) LeetCode 160. 相交链表(简单&#…

Openssl升级至openssl9.8p1含全部踩坑内容

1、安装依赖包基础条件 yum install gcc yum install gcc-c yum install perl yum install perl-IPC-Cmd yum install pam yum install pam-devel sudo yum install perl-Data-Dumper 问题一:提示yum不可用 镜像源问题更换阿里源即可 wget -O /etc/yum.repos.d/…

二战蓝桥杯所感

🌴 前言 今天是2025年4月12日,第十六届蓝桥杯结束,作为二战的老手,心中还是颇有不甘的。一方面,今年的题目比去年简单很多,另一方面我感觉并没有把能拿的分都拿到手,这是我觉得最遗憾的地方。不…

查看手机在线状态,保障设备安全运行

手机作为人们日常生活中不可或缺的工具,承载着沟通、工作、娱乐等多种功能。保障手机设备的安全运行是我们每个人都非常重要的任务,而了解手机的在线状态则是其中的一环。通过挖数据平台提供的在线查询工具,我们可以方便快捷地查询手机号的在…

#关于数据库中的时间存储

✅ 一、是否根据“机器当前时区”得到本地时间再转 UTC? 结论:是的,但仅对 TIMESTAMP 字段生效。 数据库(如 MySQL)在插入 TIMESTAMP 类型数据时: 使用当前会话的时区(默认跟随系统时区&#…

第16届蓝桥杯省赛python B组个人题解

文章目录 前言ABCDEFGH 前言 仅个人回忆,不保证正确性 貌似都是典题,针对python的长代码模拟题也没有,一小时速通了,希望不要翻车。 更新:B、G翻车了。。 A 答案:103 B 应该是按长度排序,然后…

lvs+keepalived+dns高可用

1.配置dns相关服务 1.1修改ip地址主机名 dns-master: hostnamectl hostname lvs-master nmcli c modify ens160 ipv4.method manual ipv4.addresses 10.10.10.107/24 ipv4.gateway 10.10.10.2 ipv4.dns 223.5.5.5 connection.autoconnect yes nmcli c up ens160dns-salve: h…

Spark RDD相关概念

Spark运行架构与核心组件 1.Spark运行梁构 spark运行架构包括master和slave两个主要部分。master负责管理整个集群的作业任务调度,而slave则负责实际执行任务。 dirver是Spark驱动器节点,负责执行Spark任务中的main方法,将用户程序转换成作业…

SD + Contronet,扩散模型V1.5+约束条件后续优化:保存Canny边缘图,便于视觉理解——stable diffusion项目学习笔记

目录 前言 背景与需求 代码改进方案 运行过程: 1、Run​编辑 2、过程: 3、过程时间线: 4、最终效果展示: 总结与展望 前言 机器学习缺点之一:即不可解释性。最近,我在使用stable diffusion v1.5 Co…

【ROS2】行为树:BehaviorTree

1、简介 与状态机不同,行为树强调执行动作,而不是状态之间的转换。 行为树是可组合的。可以重复使用简单的行为来构建复杂的行为。 在游戏领域,行为树已经比较流行了。主要用于维护游戏角色的各种动作和状态。 ROS2的导航框架Navigation2中引入了行为树来组织机器人的工作流…

《JVM考古现场(十八):造化玉碟·用字节码重写因果律的九种方法》

"鸿蒙初判!当前因果链突破十一维屏障——全体码农修士注意,《JVM考古现场(十八)》即将渡劫飞升!" 目录 上卷阴阳交缠 第一章:混沌初开——JVM因果律的量子纠缠 第二章:诛仙剑阵改—…

使用nuxt3+tailwindcss4+@nuxt/content3在页面渲染 markdown 文档

nuxt3tailwindcss在页面渲染 markdown 文档 页面效果 依赖 “nuxt/content”: “^3.4.0” “tailwindcss”: “^4.0.10” “nuxt”: “^3.16.2” “tailwindcss/vite”: “^4.0.10” tailwindcss/typography (这个是格式化 md 样式用的) 注意: 这里nuxt/content…

Linux网络编程——详解网络层IP协议、网段划分、路由

目录 一、前言 二、IP协议的认识 1、什么是IP协议? 2、IP协议报头 三、网段划分 1、初步认识IP与路由 2、IP地址 I、DHCP动态主机配置协议 3、IP地址的划分 I、CIDR设计 II、子网数目的计算 III、子网掩码的确定 四、特殊的IP地址 五、IP地址的数量限…

【图像生成之21】融合了Transformer与Diffusion,Meta新作Transfusion实现图像与语言大一统

论文:Transfusion: Predict the Next Token and Diffuse Images with One Multi-Modal Model 地址:https://arxiv.org/abs/2408.11039 类型:理解与生成 Transfusion模型‌是一种将Transformer和Diffusion模型融合的多模态模型,旨…

Microsoft Office 如何启用和正常播放 Flash 控件

对于新安装的 Office 默认是不支持启用 Flash 组件的,Flash 组件会无法播放或者黑屏。 本片文章就带你解决这个问题,相关资料都在下方连接内。前提概要,教程对应的版本是 mso16,即 Office 2016 及更新版本,以及 365 等…

定位改了IP属地没变怎么回事?一文解析

明明用虚拟定位软件将手机位置改到了“三亚”,为何某某应用评论区显示的IP属地还是“北京”?为什么切换了代理IP,平台却似乎“无视”这一变化? 在“IP属地显示”功能普及后,许多用户尝试通过技术手段隐藏真实位置&…

《深入理解生命周期与作用域:以C语言为例》

🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言 🌍文章目入 一、生命周期:变量的存在时间(一)生命周期的定义(二)C语言中的生命周期类型(三&#…

一个插件,免费使用所有顶级大模型(Deepseek,Gpt,Grok,Gemini)

DeepSider是一款集成于浏览器侧边栏的AI对话工具,可免费使用所有顶级大模型 包括GPT-4o,Grok3,Claude 3.5 Sonnet,Claude 3.7,Gemini 2.0,Deepseek R1满血版等 以极简交互与超快的响应速度,完成AI搜索、实时问答、内容创作、翻译、…

智能车摄像头开源—9 动态权、模糊PID、速度决策、路径优化

目录 一、前言 二、动态权 1.概述 2.偏差值加动态权 三、模糊PID 四、速度决策 1.曲率计算 2.速度拟合 3.速度控制 五、路径 六、国赛视频 一、前言 在前中期通过识别直道、弯道等元素可进行加减速操作实现速度的控制,可进一步缩减一圈的运行速度&#xff…