图像边缘检测

目录

一.图像边缘检测

1.图像边缘检测概述

2.Sobel算子原理与实现

3.Scharr算子

4.Laplacian算子

5.Canny边缘检测(重点)

6.效果对比


一.图像边缘检测

1.图像边缘检测概述

2.Sobel算子原理与实现

代码是实现步骤:

  • 边缘检测是图像处理和计算机视觉中的重要工具,用于检测数字图像中的明显变化、边缘或不连续区域。
  • 主要方法包括:Sobel算子、scharr算子,Laplacian算子、Canny算子等。
  • Sobel算子结合高斯平滑和微分求导,通过局部差分计算梯度近似值。
  • 包含两组3x3矩阵(横向和纵向模板),分别用于水平和垂直方向的边缘检测。
  • 横向检测:用右边像素值减去左边像素值;纵向检测:用下方像素值减去上方像素值。
  • 检测时需分步进行(先横向后纵向),避免同时设置dx=1dy=1导致结果不理想(线条过细且存在空洞)。
  • 横向检测
    • 使用cv2.Sobel(),设置dx=1dy=0,数据类型为cv2.CV_64F以保存负数梯度值。
    • 对结果取绝对值(cv2.convertScaleAbs)将负数转为正数显示。
  • 纵向检测
    • 设置dx=0dy=1,同样使用cv2.CV_64F并取绝对值。
  • 融合结果:通过图像加权融合(cv2.addWeighted)将横向和纵向检测结果合并,填补空洞。
import cv2
#1.sobel算子
yuan=cv2.imread('img.png',0)
cv2.imshow('yuan',yuan)
cv2.waitKey(0)
#x方向上的边缘
yuan_x=cv2.Sobel(yuan,-1,dx=1,dy=0)#信息范围(0~255)
cv2.imshow('yuan_x',yuan_x)
cv2.waitKey(0)
yuan_x_64=cv2.Sobel(yuan,cv2.CV_64F,dx=1,dy=0)#信息范围(-1020~1020)
cv2.imshow('yuan_x_64',yuan_x_64)
cv2.waitKey(0)
#x方向上的边缘含负数信息无法显示,所以进行取绝对值操作
yuan_x_full=cv2.convertScaleAbs(yuan_x_64)
cv2.imshow('yuan_x_full',yuan_x_full)
cv2.waitKey(0)
#y方向上的边缘
yuan_y_64=cv2.Sobel(yuan,cv2.CV_64F,dx=0,dy=1)#信息范围(-1020~1020)
cv2.imshow('yuan_y_64',yuan_y_64)
cv2.waitKey(0)
yuan_y_full=cv2.convertScaleAbs(yuan_y_64)
cv2.imshow('yuan_y_full',yuan_y_full)
cv2.waitKey(0)
#图像加权运算组合
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)
cv2.destroyAllWindows()

注意事项:

  • 输入图像需先转换为灰度图。
  • 避免直接使用unit8数据类型(会丢失负数梯度信息),推荐使用cv2.CV_64F
  • 分步检测后融合的效果优于同时设置dx=1dy=1

3.Scharr算子

  • 改进:中心权重更大(中间为10,四角为3),精度更高,但线条更密集(可能包含更多伪边缘)。
  • 代码实现:仅需将Sobel算子中的cv2.Sobel改为cv2.Scharr
#2.scharr算子
img=cv2.imread('img.png',0)
cv2.imshow('img',img)
cv2.waitKey(0)
img_x_64 = cv2.Scharr(img,cv2.CV_64F,dx=1,dy=0)
img_x_full=cv2.convertScaleAbs(img_x_64)
img_y_64 = cv2.Scharr(img,cv2.CV_64F,dx=0,dy=1)
img_y_full=cv2.convertScaleAbs(img_y_64)
img_xy_full=cv2.addWeighted(img_x_full,1,img_y_full,1,0)
cv2.imshow('img_xy_full',img_xy_full)
cv2.waitKey(0)

4.Laplacian算子

  • 特点:不区分方向(直接计算变化率),卷积核中心为-4,四周为1,无需分步融合。
  • 代码:cv2.Laplacian + 取绝对值,步骤更简单,但效果较粗糙(线条断续、颜色淡)。
    img=cv2.imread('img.png',0)
    img_lap=cv2.Laplacian(img,cv2.CV_64F)
    img_lap_full=cv2.convertScaleAbs(img_lap)
    cv2.imshow('img_lap_full',img_lap_full)
    cv2.waitKey(0)

5.Canny边缘检测(重点)

  • 原理
    1. 高斯降噪:去除噪声干扰。
    2. 梯度计算:通过Sobel算子计算梯度幅值和方向(像素变化最剧烈的方向)。
    3. 非极大值抑制:保留梯度方向上最亮的点,抑制其他点。
    4. 双阈值筛选
      • 高阈值(如150):强边缘(保留)。
      • 低阈值(如100):弱边缘(若与强边缘连接则保留,否则剔除)。
  • 代码实现
    #4.canny算子
    img=cv2.imread('img.png',0)
    img_canny=cv2.Canny(img,120,180)
    img_canny_full=cv2.convertScaleAbs(img_canny)
    cv2.imshow('img_canny_full',img_canny_full)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 优势

边缘更细、更真实(避免伪边缘)。

背景干净(纯黑),仅保留显著轮廓。

  • 参数调整:阈值过高可能导致边缘断裂,过低则噪声增多。

6.效果对比

  • Sobel/Scharr:检测较多细节(如花纹),但可能包含非边缘信息。
  • Laplacian:线条较淡,连续性差。
  • Canny:仅保留强边缘(如人物轮廓),背景纯净,适合

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

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

相关文章

zookeeper-znode解析

一. 数据模型:ZK拥有一个命名空间就像一个精简的文件系统,不同的是它的命名空间中的每个节点拥有它自己或者它下面子节点相关联的数据。ZK中必须使用绝对路径也就是使用“/”开头。二. znode:zk目录树中每个节点对应一个znode。每个znode维护…

Redis 高可用篇

主从复制是怎么实现的? 如果服务器发生了宕机,由于数据恢复是需要点时间,那么这个期间是无法服务新的请求的;如果这台服务器的硬盘出现了故障,可能数据就都丢失了。 要避免这种单点故障,最好的办法是将数据…

C++ 指针与引用面试深度解析

C 指针与引用面试深度解析面试官考察指针和引用,不仅是考察语法,更是在考察你对C中 “别名” (Aliasing) 与 “地址” (Addressing) 这两种间接访问机制的理解,以及你对 “代码安全” 和 “接口设计” 的思考深度。第一部分:核心知…

LinuxC语言线程的同步与互斥

一.线程的同步与互斥1. 基础概念:1.1 互斥:对共享资源的访问,同一时刻只允许一个访问者进行访问,互斥具有唯一和排他性,互斥无法保证对共享资源的访问顺序1.2 同步: 在互斥的基础上,实现对共享资源的有序访问。2. 互斥…

Centos 7.6离线安装docker

在内网环境下,一般不能联网在线部署,这时候就需要以离线的方式安装docker。本节内容主要总结一下在CentOS 7.6环境中离线安装docker的步骤。 1、下载docker安装包 https://pan.baidu.com/share/init?surlPaUllQZ-dwpgJ7quA5IkcQ&pwd4sfc 2、上传到服…

生成式推荐模型的长序列特征:离线存储

文章目录长序列特征的例子1. Event-level features2. Sequence-level featuresAggregation FeaturesSession-based FeaturesTemporal Order Features3. User-level features4. Interaction features (between user and item/context)how to store the long term user behaviro …

Linux inode 实现机制深入分析

Linux inode 实现机制深入分析 1 Inode 基本概念与作用 Inode(Index Node)是 Linux 和其他类 Unix 操作系统中文件系统的核心数据结构,用于存储文件或目录的元数据(metadata)。每个文件或目录都有一个唯一的 inode&…

Flask 之请求钩子详解:掌控请求生命周期

在构建现代 Web 应用时,我们常常需要在请求的不同阶段自动执行一些通用逻辑,例如:记录日志、验证权限、连接数据库、压缩响应、添加安全头等。如果在每个视图函数中重复这些代码,不仅冗余,而且难以维护。Flask 请求钩子…

设计模式七大原则附C++正反例源码

设计模式的七大原则是软件设计的基石,它们指导开发者构建高内聚、低耦合、易维护、可扩展的系统。以下以C++为例,详细介绍这七大原则: 一、单一职责原则(Single Responsibility Principle, SRP) 定义:一个类应该只有一个引起它变化的原因(即一个类只负责一项职责)。 …

云计算之中间件与数据库

一、云数据库的特性云数据库是指被优化或部署到一个虚拟计算环境中的数据库,可以实现按需付费、按需扩展、高可用性以及存储整合等优势。根据数据库类型一般分为关系型数据库和非关系型数据库(NoSQL数据库) 。云数据库的特性序号云数据库的特…

codeforces(1045)(div2) E. Power Boxes

E.电源箱 每次测试时限: 2 秒 每次测试的内存限制:256 兆字节 输入:标准输入 输出:标准输出 这是一个互动问题。 给你 nnn 个方格,索引从 111 到 nnn 。这些方格看起来完全相同,但是每个方格都有一个隐藏的…

4G模块 EC200通过MQTT协议连接到阿里云

命令说明 基础AT指令ATI显示MT的ID信息ATCIMI查询IMSIATQCCID查询ICCIDATCSQ查询信号强度ATCGATT?查询当前PS域状态MQTT配置指令ATQMTCFG配置MQTT可选参数ATQMTCFG配置MQTT可选参数.ATQMTOPEN打开MQTT客户端网络ATQMTCLOSE关闭MQTT客户端网络ATQMTCONN连接客户端到MQTT服务器…

如何选择合适的安全监测预警系统

在当今高度复杂和互联的数字化时代,安全威胁无处不在且持续演变。一套高效、可靠的安全监测预警系统已成为组织保障其物理资产、数字信息和关键业务连续性的核心基础设施。然而,面对市场上琳琅满目的产品和解决方案,如何做出符合自身需求的选…

ELK-使用logstash-output-zabbix插件实现日志通过zabbix告警

ELK-使用logstash-output-zabbix插件实现日志通过zabbix告警logstash-output-zabbix插件安装编辑logstash配置文件在zabbix上创建模板实现的效果:elk收集上来的日志中含有报错时(例如error等),logstash过滤出来将这部分日志打到zabbix,再通过zabbix结合钉…

【C++游记】物种多样——谓之多态

枫の个人主页 你不能改变过去,但你可以改变未来 算法/C/数据结构/C Hello,这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕,我们继续来学习C的内容呀。C是接近底层有比较经典的语言,因此学习起来注定枯燥无味&#xf…

Visual Scope (Serial_Digital_Scope V2) “串口 + 虚拟示波器” 工具使用记录

VisualScope 就是一个 “串口 + 虚拟示波器” 的工具,适合在没有昂贵示波器/逻辑分析仪时做嵌入式调试。它的核心步骤就是 MCU 定时发数据 → PC 串口接收 → 软件画波形。 首先准备串口通信工具后,插入电脑,安装完USB转串口驱动后,在“我的电脑”-“设备及管理器”-“端口…

c++ 观察者模式 订阅发布架构

#include <iostream> #include <vector> #include <algorithm> #include <memory> #include <mutex>// 观察者接口 class IObserver { public:virtual ~IObserver() default;virtual void update(const std::string& message) 0; };// 主题…

oracle 表空间扩容(增加新的数据文件)

SELECT tablespace_name,file_name,ROUND(bytes / 1024 / 1024, 2) AS size_mb,ROUND(maxbytes / 1024 / 1024, 2) AS max_size_mb,status,autoextensible FROM dba_data_files ORDER BY tablespace_name;--给表空间增加一个新数据库文件ALTER TABLESPACE EAS_D_EAS_STANDARDAD…

DAY 58 经典时序预测模型2

知识点回顾&#xff1a; 时序建模的流程时序任务经典单变量数据集ARIMA&#xff08;p&#xff0c;d&#xff0c;q&#xff09;模型实战SARIMA摘要图的理解处理不平稳的2种差分 n阶差分---处理趋势季节性差分---处理季节性 昨天我们掌握了AR, MA, 和 ARMA 模型&#xff0c;它们…