图像识别边缘算法

文章目录

    • 1. 基本概念
    • 2. 边缘检测原理
      • 边缘类型:
    • 3. 常见边缘检测算法
      • 3.1 Sobel算子
      • 3.2 Canny边缘检测
      • 3.3 Laplacian算子
    • 4. Canny边缘检测详细流程
      • 流程图示例:
      • 详细步骤说明:
    • 5. 边缘检测算法比较
    • 6. 参数调优建议
      • Canny边缘检测参数:
      • Sobel算子参数:
    • 8. 实际应用场景
      • 8.1 医学图像处理
      • 8.2 工业检测
      • 8.3 自动驾驶
      • 8.4 安防监控

1. 基本概念

边缘检测是图像处理和计算机视觉中的基础技术,用于识别图像中物体的边界。边缘是指图像中像素强度发生急剧变化的区域,通常对应于物体的轮廓、纹理变化或光照变化。

2. 边缘检测原理

边缘检测的基本原理是通过计算图像中像素的梯度来检测边缘。梯度表示像素强度变化的速率和方向。在边缘处,像素强度会发生显著变化,因此梯度值会很大。

边缘类型:

  • 阶跃边缘:像素强度突然变化
  • 屋顶边缘:像素强度逐渐变化后恢复
  • 线条边缘:细线状结构

3. 常见边缘检测算法

3.1 Sobel算子

Sobel算子是一种基于梯度的边缘检测算法,通过计算图像在水平和垂直方向上的梯度来检测边缘。

import cv2
import numpy as np
import matplotlib.pyplot as pltdef sobel_edge_detection(image):"""使用Sobel算子进行边缘检测"""# 转换为灰度图像if len(image.shape) == 3:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)else:gray = image# 计算x和y方向的梯度sobelx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)sobely = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)# 计算梯度幅值sobel_combined = np.sqrt(sobelx**2 + sobely**2)return sobelx, sobely, sobel_combined# 示例使用
# image = cv2.imread('sample.jpg')
# sobelx, sobely, sobel_combined = sobel_edge_detection(image)

3.2 Canny边缘检测

Canny边缘检测是一种多阶段算法,被认为是边缘检测的黄金标准。

def canny_edge_detection(image, low_threshold=50, high_threshold=150):"""使用Canny算法进行边缘检测"""# 转换为灰度图像if len(image.shape) == 3:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)else:gray = image# 应用高斯滤波去噪blurred = cv2.GaussianBlur(gray, (5, 5), 0)# Canny边缘检测edges = cv2.Canny(blurred, low_threshold, high_threshold)return edges# 示例使用
# edges = canny_edge_detection(image)

3.3 Laplacian算子

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

def laplacian_edge_detection(image):"""使用Laplacian算子进行边缘检测"""# 转换为灰度图像if len(image.shape) == 3:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)else:gray = image# 应用高斯滤波去噪blurred = cv2.GaussianBlur(gray, (3, 3), 0)# Laplacian边缘检测laplacian = cv2.Laplacian(blurred, cv2.CV_64F)return laplacian

4. Canny边缘检测详细流程

Canny边缘检测算法包含以下几个步骤:

流程图示例:

原始图像↓
转换为灰度图像↓
高斯滤波去噪↓
计算梯度幅值和方向↓
非极大值抑制↓
双阈值检测↓
边缘连接(滞后阈值)↓
最终边缘图像

详细步骤说明:

  1. 灰度化:将彩色图像转换为灰度图像
  2. 噪声去除:使用高斯滤波器平滑图像
  3. 梯度计算:计算每个像素的梯度幅值和方向
  4. 非极大值抑制:细化边缘,使边缘只有一个像素宽
  5. 双阈值检测:使用高低阈值确定强边缘和弱边缘
  6. 边缘连接:通过滞后阈值连接边缘
def detailed_canny_process(image):"""详细展示Canny边缘检测的每个步骤"""# 步骤1: 转换为灰度图像if len(image.shape) == 3:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)else:gray = image# 步骤2: 高斯滤波去噪blurred = cv2.GaussianBlur(gray, (5, 5), 1.4)# 步骤3: 计算梯度# 使用Sobel算子计算梯度grad_x = cv2.Sobel(blurred, cv2.CV_64F, 1, 0, ksize=3)grad_y = cv2.Sobel(blurred, cv2.CV_64F, 0, 1, ksize=3)# 计算梯度幅值和方向magnitude = np.sqrt(grad_x**2 + grad_y**2)angle = np.arctan2(grad_y, grad_x)# 步骤4: 非极大值抑制suppressed = non_maximum_suppression(magnitude, angle)# 步骤5: 双阈值检测weak = 50strong = 150thresholded = double_threshold(suppressed, weak, strong)# 步骤6: 边缘连接edges = hysteresis(thresholded, weak, strong)return edgesdef non_maximum_suppression(magnitude, angle):"""非极大值抑制"""rows, cols = magnitude.shapesuppressed = np.zeros((rows, cols), dtype=np.int32)angle = angle * 180. / np.piangle[angle < 0] += 180for i in range(1, rows-1):for j in range(1, cols-1):try:q = 255r = 255# 角度0度if (0 <= angle[i,j] < 22.5) or (157.5 <= angle[i,j] <= 180):q = magnitude[i, j+1]r = magnitude[i, j-1]# 角度45度elif (22.5 <= angle[i,j] < 67.5):q = magnitude[i+1, j-1]r = magnitude[i-1, j+1]# 角度90度elif (67.5 <= angle[i,j] < 112.5):q = magnitude[i+1, j]r = magnitude[i-1, j]# 角度135度elif (112.5 <= angle[i,j] < 157.5):q = magnitude[i-1, j-1]r = magnitude[i+1, j+1]if (magnitude[i,j] >= q) and (magnitude[i,j] >= r):suppressed[i,j] = magnitude[i,j]else:suppressed[i,j] = 0except IndexError as e:passreturn suppresseddef double_threshold(img, weak, strong):"""双阈值检测"""high_threshold = img.max() * 0.2low_threshold = high_threshold * 0.05rows, cols = img.shaperesult = np.zeros((rows, cols), dtype=np.int32)weak_i, weak_j = np.where((img <= high_threshold) & (img >= low_threshold))strong_i, strong_j = np.where(img >= high_threshold)result[strong_i, strong_j] = strongresult[weak_i, weak_j] = weakreturn resultdef hysteresis(img, weak, strong):"""边缘连接(滞后阈值)"""rows, cols = img.shapefor i in range(1, rows-1):for j in range(1, cols-1):if (img[i,j] == weak):try:if ((img[i+1, j-1] == strong) or (img[i+1, j] == strong) or (img[i+1, j+1] == strong)or (img[i, j-1] == strong) or (img[i, j+1] == strong)or (img[i-1, j-1] == strong) or (img[i-1, j] == strong) or (img[i-1, j+1] == strong)):img[i, j] = strongelse:img[i, j] = 0except IndexError as e:passreturn img

5. 边缘检测算法比较

算法优点缺点适用场景
Sobel计算简单,对噪声有一定抑制作用边缘较粗,定位不够精确实时应用,对精度要求不高的场景
Canny检测精度高,边缘连续性好计算复杂,参数敏感高精度边缘检测需求
Laplacian能检测到细小边缘对噪声敏感需要检测细节特征的场景
Prewitt计算简单,各向同性对噪声敏感,边缘较粗简单的边缘检测任务

6. 参数调优建议

Canny边缘检测参数:

  • 低阈值:通常设为高阈值的0.4-0.5倍
  • 高阈值:可根据图像的噪声水平调整
  • 高斯核大小:一般选择3x3或5x5

Sobel算子参数:

  • 核大小:通常选择3x3,也可选择5x5以获得更大范围的梯度

8. 实际应用场景

8.1 医学图像处理

  • 肿瘤边界检测
  • 器官轮廓识别
  • 细胞结构分析

8.2 工业检测

  • 产品质量检测
  • 缺陷识别
  • 尺寸测量

8.3 自动驾驶

  • 车道线检测
  • 行人和车辆识别
  • 交通标志识别

8.4 安防监控

  • 运动目标检测
  • 人脸识别预处理
  • 行为分析

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

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

相关文章

【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(终)

&#x1f9ea; 测试与质量保证 &#x1f50d; 全方位测试体系 我建立了企业级的全方位测试体系来确保系统质量&#xff1a; &#x1f9ea; 测试金字塔模型 #mermaid-svg-u4I8UuUAyxJVjcqs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill…

QT开发---网络编程下

HTTP协议 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的协议之一&#xff0c;用于客户端和服务器之间的通信。默认端口80&#xff0c;传输层使用的是TCP协议特点无连接&#xff1a;HTTP协议是无连接的&#xff…

mac 苹果电脑 Intel 芯片(Mac X86) 安卓虚拟机 Android模拟器 的救命稻草(下载安装指南)

引言&#xff1a; 还在为你的Intel芯片MacBook&#xff08;i5, i7, i9等&#xff09;找不到合适的安卓虚拟机而发愁吗&#xff1f;随着Apple Silicon (M1/M2/M3) 芯片的普及&#xff0c;大量优秀的安卓模拟器&#xff08;如Android Studio自带的模拟器、网易MuMu等&#xff09;…

C语言:顺序表(上)

C语言&#xff1a;顺序表&#xff08;上&#xff09; 1.顺序表的介绍 2.顺序表的实现 1.顺序表的介绍 线性表是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在…

GPT - 5被曝将在8月初发布!并同步推出mini、nano版

据《TheVerge》最新报道&#xff0c;OpenAI 正准备在 8 月发布新版本旗舰大模型 GPT-5&#xff0c;如果顺利的话发布节点最早会在 8 月初。同时&#xff0c;下个月发布 GPT-5 时&#xff0c;还会一并推出 mini&#xff08;小型&#xff09;和 nano&#xff08;微型&#xff09;…

【Linux操作系统】简学深悟启示录:Linux环境基础开发工具使用

文章目录1.软件包管理器yum2.Linux编辑器vim2.1 三模式切换2.2 正常模式2.3 底行模式2.4 可视化模式2.5 vim 配置3.Linux编译器gcc/g3.1 预处理3.2 编译3.3 汇编3.4 连接3.5 函数库4.Linux自动化构建工具Makefile5.Linux调试器gdb希望读者们多多三连支持小编会继续更新你们的鼓…

八大神经网络的区别

神经网络名称全称/修正名称主要作用核心特点典型应用场景CINICNN&#xff08;卷积神经网络&#xff09;处理图像、视频等空间数据&#xff0c;提取局部特征。使用卷积核、池化操作&#xff1b;擅长平移不变性。图像分类、目标检测、人脸识别。RINIRNN&#xff08;循环神经网络&…

从 SQL Server 到 KingbaseES V9R4C12,一次“无痛”迁移与深度兼容体验实录

#数据库平替用金仓 #金仓产品体验官 摘要&#xff1a;本文以体验项目案例为主线&#xff0c;从下载安装、数据类型、T-SQL、JDBC、性能基准、踩坑回退六大维度&#xff0c;全景验证 KingbaseES V9R4C12 对 SQL Server 的“零改造”兼容承诺&#xff1b;并给出 TPCH 100G 性能对…

EasyPlayer播放器系列开发计划2025

EasyPlayer系列产品发展至今&#xff0c;已经超过10年&#xff0c;从最早的EasyPlayer RTSP播放器&#xff0c;到如今维护的3条线&#xff1a;EasyPlayer-RTSP播放器&#xff1a;Windows、Android、iOS&#xff1b;EasyPlayerPro播放器&#xff1a;Windows、Android、iOS&#…

通信名词解释:I2C、USART、SPI、RS232、RS485、CAN、TCP/IP、SOCKET、modbus等

以下内容参考AI生成内容1. I2C&#xff08;Inter-Integrated Circuit&#xff0c;集成电路间总线&#xff09;定义&#xff1a;由飞利浦&#xff08;现恩智浦&#xff09;开发的短距离串行通信总线&#xff0c;用于芯片级设备间的低速数据传输。工作原理&#xff1a;采用两根信…

bash的特性-常见的快捷键

一、前言在 Linux Shell 编程和日常使用中&#xff0c;Bash 快捷键 是提升命令行操作效率的利器。熟练掌握这些快捷键&#xff0c;不仅可以节省大量输入时间&#xff0c;还能显著提升你在终端环境下的操作流畅度。本文将带你全面了解 Bash 中常用的快捷键&#xff0c;包括&…

【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)

&#x1f3a8; 核心功能设计 &#x1f464; 用户管理系统 用户管理是整个系统的基础&#xff0c;我设计了完整的用户生命周期管理&#xff1a; &#x1f510; 用户注册流程 #mermaid-svg-D0eUHWissjNhkqlB {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…

uniapp input 聚焦时键盘弹起滚动到对应的部分

实现效果代码如下<template><view idapp><view class"aa"></view><iconfont name"left"></iconfont>姓氏&#xff1a;<input style"background-color: antiquewhite;" type"text" v-model&quo…

【基础篇三】WebSocket:实时通信的革命

目录 一、传统HTTP的"痛点"分析 1.1 HTTP的单向通信模式 1.2 "实时"效果的痛苦尝试 ​编辑 1.3 性能对比分析 二、WebSocket 协议详解 2.1 WebSocket是什么&#xff1f; ​编辑 2.2 WebSocket的核心特性 2.2.1 全双工通信&#xff08;Full-Duple…

设计模式(十八)行为型:中介者模式详解

设计模式&#xff08;十八&#xff09;行为型&#xff1a;中介者模式详解中介者模式&#xff08;Mediator Pattern&#xff09;是 GoF 23 种设计模式中的行为型模式之一&#xff0c;其核心价值在于通过引入一个中介者对象来封装一组对象之间的交互&#xff0c;从而降低对象间的…

Upload-Labs通关全攻略详细版

前端校验绕过:pass 01 两种思路:1.通过抓包,修改后缀 2.前端禁用js绕过前端后缀检验 首先写一个木马,改为图片格式GIF89a<?php eval($_POST[cmd])?>抓包之后改为PHP格式: 使用蚁剑连接木马,第一次尝试一直是返回数据为空,原因是没有链接到木马,于是寻找木马地址…

C#观察者模式示例代码

using System; using System.Collections.Generic; using System.Threading;namespace RefactoringGuru.DesignPatterns.Observer.Conceptual {// Observer观察者 也可以叫做订阅者 subscriberspublic interface IObserver{// Receive update from subject// 接收来自主题的更新…

电子电子架构 --- 软件项目的开端:裁剪

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

Open CV图像基本操作可莉版

Open CV图像基本操作一、处理单个像素值访问像素值修改像素值二、处理单个ROI区域&#xff08;自选区域&#xff09;提取 ROI修改 ROI三、 处理图像通道通道分离通道合并四、处理整体图像缩放图像旋转图像平移图像翻转一、处理单个像素值 图像是由像素组成的矩阵&#xff0c;每…

k8s:将打包好的 Kubernetes 集群镜像推送到Harbor私有镜像仓库

本文介绍了在离线环境中部署Harbor镜像仓库的完整流程。首先通过脚本创建多个Harbor项目&#xff0c;然后使用KubeKey工具将预打包的Kubernetes镜像(kubesphere.tar.gz)推送到Harbor仓库。接着配置containerd以支持从私有仓库拉取镜像&#xff0c;包括设置TLS证书和镜像仓库端点…