边缘检测技术现状初探2:多尺度与形态学方法
一、多尺度边缘检测方法
多尺度边缘检测通过在不同分辨率/平滑度下分析图像,实现:
- 粗尺度(大σ值):抑制噪声,提取主体轮廓
- 细尺度(小σ值):保留细节,检测微观缺陷
- 尺度融合:综合各层级特征形成完整边缘描述
1.1 数学表达(高斯尺度空间)
图像 I ( x , y ) I(x,y) I(x,y)在尺度 t t t( t = σ 2 t = \sigma^2 t=σ2)下的表示为:
L ( x , y , t ) = G ( x , y , t ) ∗ I ( x , y ) L(x,y,t) = G(x,y,t) * I(x,y) L(x,y,t)=G(x,y,t)∗I(x,y)
其中高斯核 G ( x , y , t ) = 1 2 π t e − x 2 + y 2 2 t G(x,y,t) = \frac{1}{2\pi t}e^{-\frac{x^2+y^2}{2t}} G(x,y,t)=2πt1e−2tx2+y2
1.2 典型案例
高斯金字塔多尺度Canny
import cv2
import numpy as np
import matplotlib.pyplot as pltdef multi_scale_canny(img, scales=[1.0, 2.0, 4.0]):# 初始化结果矩阵edges_stack = np.zeros_like(img, dtype=np.uint8)for sigma in scales:# 高斯模糊blurred = cv2.GaussianBlur(img, (0, 0), sigmaX=sigma)# 动态阈值Canny(阈值随尺度调整)low_thresh = int(30 * (sigma / 2.0))high_thresh = int(90 * (sigma / 2.0))edges = cv2.Canny(blurred, low_thresh, high_thresh)# 多尺度叠加edges_stack = cv2.bitwise_or(edges_stack, edges)return edges_stackimg = cv2.imread("../sports.jpg", 0)
result = multi_scale_canny(img, scales=[1.0, 2.0, 4.0])plt.figure(figsize=(15, 5))
plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('Original')
plt.subplot(122), plt.imshow(result, cmap='gray'), plt.title('multi_scale_canny')
plt.show()

Laplacian of Gaussian(LoG)算子
Laplacian of Gaussian(LoG)是一种基于二阶导数的边缘检测方法,通过结合高斯平滑与拉普拉斯算子实现多尺度边缘检测,其核心优势在于:
- 噪声免疫:高斯滤波先消除高频噪声,再进行边缘定位
- 零交叉特性:通过检测二阶导数过零点(Zero-Crossing)精确定位边缘中心
- 多尺度适应:调节高斯核σ值可控制边缘检测的粗细程度
数学表达式:
L o G ( x , y ) = − 1 π σ 4 ( 1 − x 2 + y 2 2 σ 2 ) e − x 2 + y 2 2 σ 2 LoG(x,y) = -\frac{1}{\pi\sigma^4}\left(1 - \frac{x^2 + y^2}{2\sigma^2}\right)e^{-\frac{x^2 + y^2}{2\sigma^2}} LoG(x,y)=−πσ41(1−2σ2x2+y2)e−2σ2x2+y2
实际应用中常使用离散近似核(如9×9核,σ=1.4)
代码例子
import cv2
import numpy as np
import matplotlib.pyplot as plt# 生成测试图像
img = np.zeros((300, 300), dtype=np.uint8)
cv2.rectangle(img, (50, 50), (250, 250), 200, 20) # 灰色矩形框
img[120:180, 140:160] = 100 # 添加垂直划痕
img = cv2.GaussianBlur(img, (5, 5), 0.5) # 模拟表面模糊# LoG计算
gaussian = cv2.GaussianBlur(img, (9, 9), sigmaX=1.4)
laplacian = cv2.Laplacian(gaussian, cv2.CV_64F, ksize=3)# 过零检测
log_edges = np.zeros_like(img, dtype=np.uint8)
h, w = laplacian.shape
for i in range(1, h - 1):for j in range(1, w - 1):# 检测相邻像素符号变化if (laplacian[i, j] * laplacian[i + 1, j] < 0) or \(laplacian[i, j] * laplacian[i, j + 1] < 0):log_edges[i, j] = 255# 可视化
plt.figure(figsize=(15, 5))
plt.subplot(131), plt.imshow(img, cmap='gray'), plt.title('Original')
plt.subplot(132), plt.imshow(laplacian, cmap='jet'), plt.title('LoG Response')
plt.subplot(133), plt.imshow(log_edges, cmap='gray'), plt.title('Zero-Crossing Edges')
plt.show()

小波多分辨率检测
使用OpenCV的高斯金字塔模拟小波多尺度分解,通过残差计算提取高频信息,实现多分辨率边缘检测。
import cv2
import numpy as npdef opencv_wavelet_edge(img, levels=3):# 初始化高斯金字塔pyramid = [img.astype(np.float32)]# 构建高斯金字塔for _ in range(levels):layer = cv2.pyrDown(pyramid[-1])pyramid.append(layer)# 各尺度边缘检测edges = []for i in range(1, levels+1):# 上采样重建低频图像upsampled = cv2.pyrUp(pyramid[i], dstsize=pyramid[i-1].shape[::-1])# 计算高频残差(近似小波高频子带)residual = cv2.subtract(pyramid[i-1], upsampled)residual = cv2.normalize(residual, None, 0, 255, cv2.NORM_MINMAX)# 动态阈值Canny(基于尺度调整)thresh_low = 30 + 20*(i-1)thresh_high = 90 + 20*(i-1)edge_layer = cv2.Canny(np.uint8(residual), thresh_low, thresh_high)# 尺寸对齐(避免层级尺寸不匹配)if edge_layer.shape != img.shape:edge_layer = cv2.resize(edge_layer, img.shape[::-1])edges.append(edge_layer)# 多尺度融合(加权叠加)final = cv2.addWeighted(edges[0], 0.5, edges[1], 0.3, 0)if levels > 2:final = cv2.addWeighted(final, 0.7, edges[2], 0.2, 0)return final# 使用示例
img = cv2.imread("sports.jpg", 0)
result = opencv_wavelet_edge(img, levels=3)

二、形态学方法
1.1 核心原理与基础操作
形态学方法基于集合论和结构元素对图像进行形状分析,主要操作包括:
| 操作类型 | 数学定义 | 视觉效果 | 工业应用场景 |
|---|---|---|---|
| 腐蚀 | A ⊖ B A \ominus B A⊖B | 收缩物体,消除细小噪声 | 去除塑料表面微小噪点 |
| 膨胀 | A ⊕ B A \oplus B A⊕B | 扩张物体,填充孔洞 | 连接断裂的注塑件边缘 |
| 开运算 | ( A ⊖ B ) ⊕ B (A \ominus B) \oplus B (A⊖B)⊕B | 平滑轮廓,保持主体形状 | 毛刺去除 |
| 闭运算 | ( A ⊕ B ) ⊖ B (A \oplus B) \ominus B (A⊕B)⊖B | 闭合小孔,连接邻近区域 | 气泡缺陷修复 |
2.1 基础形态学操作
import cv2
import numpy as npdef morphology_optimization(edges):# 定义结构元素(十字形消除毛刺,椭圆形填充孔洞)kernel_cross = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))kernel_ellipse = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))# 去噪:开运算消除孤立噪点cleaned = cv2.morphologyEx(edges, cv2.MORPH_OPEN, kernel_cross)# 连接:闭运算修复断裂边缘connected = cv2.morphologyEx(cleaned, cv2.MORPH_CLOSE, kernel_ellipse)# 细化处理(可选)thin = cv2.ximgproc.thinning(connected)return thincanny_edges = cv2.Canny(img, 50, 150) # 初始Canny边缘
kernel = np.ones((3, 3), np.uint8)
edges = cv2.dilate(canny_edges, kernel, iterations=1)
optimized_edges = morphology_optimization(canny_edges)

相关文章:
边缘检测技术现状初探2:多尺度与形态学方法
一、多尺度边缘检测方法 多尺度边缘检测通过在不同分辨率/平滑度下分析图像,实现: 粗尺度(大σ值):抑制噪声,提取主体轮廓细尺度(小σ值):保留细节,检测微观…...
【AI News | 20250402】每日AI进展
AI Repos 1、Dolphin 由数据海洋AI与清华大学联合研发的Dolphin多任务语音识别模型正式亮相。该模型覆盖东亚、南亚、东南亚及中东地区40余种语言,并支持22种汉语方言,训练数据量超21万小时(含自有及开源数据),具备语…...
大智慧前端面试题及参考答案
如何实现水平垂直居中? 在前端开发中,实现元素的水平垂直居中是一个常见的需求,以下是几种常见的实现方式: 使用绝对定位和负边距:将元素的position设置为absolute,然后通过top、left属性将其定位到父元素的中心位置,再使用负的margin值来调整元素自身的偏移,使其水平垂…...
LLM 分词器Tokenizer 如何从 0 到 1 训练出来
写在前面 大型语言模型(LLM)处理的是人类的自然语言,但计算机本质上只能理解数字。Tokenizer(分词器) 就是架在自然语言和计算机数字表示之间的一座至关重要的桥梁。它负责将我们输入的文本字符串分解成模型能够理解的最小单元——Token,并将这些 Token 转换成对应的数字…...
操作系统高频(七)虚拟地址与页表
操作系统高频(六)虚拟地址与页表 1.什么是文件系统?它的作用是什么?⭐ 存储管理:文件系统负责管理计算机的存储设备,如硬盘、固态硬盘等。它将文件存储在这些设备上,并负责分配和回收存储空间…...
openEuler24.03 LTS下安装Flume
目录 前提条件 下载Flume 解压 设置环境变量 修改日志文件 测试Flume 在node2安装Flume 前提条件 Linux安装好jdk Flume一般需要配合Hadoop使用,安装好Hadoop完全分布式集群,可参考:openEuler24.03 LTS下安装Hadoop3完全分布式 下载F…...
现代几何风格网页标牌标识logo海报标题设计psai英文字体安装包 Myfonts – Gilroy Font Family
Gilroy 是一款具有几何风格的现代无衬线字体。它是原始 Qanelas 字体系列的弟弟。它有 20 种粗细、10 种直立字体和与之匹配的斜体。Light 和 ExtraBold 粗细是免费的,因此您可以随心所欲地使用它们。设计时考虑到了强大的 opentype 功能。每种粗细都包括扩展语言支…...
ControlNet-Tile详解
一、模型功能与应用 1. 模型功能 ControlNet-Tile模型的主要功能是图像的细节增强和质量提升。它通过以下几个步骤实现这一目标: 语义分割:模型首先对输入的图像进行语义分割,识别出图像中不同的区域和对象。这一步是为了让模型理解图像的内…...
leetcode 2873. 有序三元组中的最大值 I
欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 文章目录 题目描述题目剖析&信息挖掘解题思路方法一 暴力枚举法思路注意复杂度代码实现 方法二 公式拆分动态规划思路注意复杂度代码实现 题目描述 [2873] 有序三元…...
Java创建对象和spring创建对象的过程和区别
暮乘白帝过重山 从new到IoC的演进,体现了软件工程从"怎么做"到"做什么"的思维转变。理解Java对象创建的底层机制,是写出高性能代码的基础;掌握Spring的Bean管理哲学,则是构建可维护大型系统的关键。二者如同…...
RabbitMQ应用2
RabbitMQ应用2 一.实际业务逻辑订单系统中使用MQ(不写订单系统逻辑)1.项目的创建和准备2.代码实现ControllerConfigurationproperties 二.物流系统使用MQ(不实现物流系统业务)1.项目创建同订单(一样)2.代码…...
Windows 实战-evtx 文件分析--笔记
Windows 取证之EVTX日志 - 蚁景网安实验室 - 博客园 一.evtx日志文件是什么 从 Windows NT 6.0(也就是 Windows Vista 和 Windows Server 2008)开始,微软引入了一种全新的日志文件格式,称为 evtx。这种格式取代了之前 Windows 系…...
Vue3的组件通信
父子通信 父传子 1.父组件给子组件添加属性传值 const myCount ref(10) ... <son :count"myCount"/>2.子组件通过defineProps编译器宏接收 const props defineProps({count: Number })3.子组件使用 {{count}}子传父 1. 父组件实现处理函数 const getM…...
【postgresql】锁概览
常规锁 场景测试案例...
python中的 f 是什么意思,f‘{username}_log_archive_{int(time.time())}.txt‘
python中的 f 是什么意思,f’{username}log_archive{int(time.time())}.txt’ 在 Python 中,f 是一种字符串前缀,用于创建格式化字符串(也称为 f-string),它是 Python 3.6 及更高版本引入的一种方便的字符串格式化方式。 基本语法和功能 当你在字符串前加上 f 前缀时,…...
子组件使用:visible.sync=“visible“进行双向的绑定导致该弹窗与其他弹窗同时显示的问题
问题描述:最近写代码时遇到了一个问题:点击A弹窗后关闭,继续点击B弹窗,这时会同时弹窗A、B两个弹窗。经过排查后发现在子组件定义时使用了:visible.sync"visible"属性进行双向的数据绑定 <template> <el-dial…...
【AI产品分享】面向图片的原始位置翻译功能
1. 背景 在撰写文字材料时,往往需要配套图像以增强表达效果。然而,有时自己绘制的图可能达不到理想的质量,而在其他文献材料中却能发现更清晰、直观的示例。希望在“站在巨人的肩膀上”优化自己的图像时,通常希望在保留原始图像的…...
存储型XSS漏洞解析
一、存储型XSS漏洞的核心原理 定义与攻击流程 存储型XSS(Stored XSS)是一种将恶意脚本永久存储在服务器端(如数据库、文件系统)的跨站脚本攻击方式。其攻击流程分为四步: 注入阶段:攻击者通过输入点&…...
【无标题】跨网段耦合器解决欧姆龙CJ系列PLC通讯问题案例
欧姆龙CJ系列PLC不同网段的通讯问题 一、项目背景 某大型制造企业的生产车间内,采用了多台欧姆龙CJ系列PLC对生产设备进行控制。随着企业智能化改造的推进,需要将这些PLC接入工厂的工业以太网,以便实现生产数据的实时采集、远程监控以及与企业…...
K8S学习之基础七十二:Ingress基于Https代理pod
Ingress基于Https代理pod 1、构建TLS站点 (1)准备证书,在xianchaomaster1节点操作 cd /root/ openssl genrsa -out tls.key 2048 openssl req -new -x509 -key tls.key -out tls.crt -subj /CCN/STBeijing/LBeijing/ODevOps/CNak.lucky.com…...
node.js版本管理
概述 遇到了版本升级后,以前项目不兼容的问题。 下载一个node.js的版本管理工具,官网下载地址,可以选择版本下载,我选择的1.11.1版本的。下载完成后点击安装,分别选择nvm安装目录和nodejs的安装目录,点击安…...
Gartner预计2025年AI支出达6440亿美元:数据中心与服务器市场的关键驱动与挑战
根据Gartner最新预测,2025年全球生成式人工智能(GenAI)支出将达到6440亿美元,较2024年增长76.4%,其中80%的支出将集中于硬件领域,尤其是集成AI能力的服务器、智能手机和PC等设备。这一增长的核心驱动力来自…...
clickhouse集群版本部署文档
集群版本介绍 clickhouse是表级别的集群,一个clickhouse实例可以有分布式表,也可以有本地表。本文介绍4个节点的clickhouse情况下部署配置。 分布式表数据分成2个分片,2个副本,总共4份数据: 节点1数据:分…...
AI提示词:好评生成器
提示说明 生成一段幽默的好评 提示词 # Role: 好评生成器# Profile: - author: xxx - version: 1.0 - language: 中文 - description: 生成一段幽默的好评## Goals: - 根据用户提供的体验优点生成一段幽默的好评 - 视角采用第一人称来描述(站在用户的视角) - 用词口语化、语…...
重新安装VMware tools为灰色无法点击问题解决|读取电脑文件的共享文件夹方法
1.问题VMware tools为灰色 sudo systemctl status vmware-tools 显示:Unit vmware-tools.service could not be found. 改 检测方式 弹出(之前没有) 在重启的瞬间点安装 弹出: 双击打开 右键打开终端,解压 cd ~ ta…...
构造超小程序
文章目录 构造超小程序1 编译器-大小优化2 编译器-移除 C 异常3 链接器-移除所有依赖库4 移除所有函数依赖_RTC_InitBase() _RTC_Shutdown()__security_cookie __security_check_cookie()__chkstk() 5 链接器-移除清单文件6 链接器-移除调试信息7 链接器-关闭随机基址8 移除异常…...
mycat --分片规则--
文章目录 MyCat分片规则详解1. rule1 (基于id的func1算法)2. sharding-by-date (按日期分片)3. rule2 (基于user_id的func1算法)4. sharding-by-intfile (基于枚举值分片)5. auto-sharding-long (长整型范围分片)6. mod-long (取模分片)7. sharding-by-murmur (MurmurHash分片)…...
wireshark抓包分析数据怎么看 wireshark使用教程_wireshark怎么看
Wireshark与Sniff Master:网络抓包工具使用指南 网络抓包分析是开发测试和网络故障排查中不可或缺的技能。在众多抓包工具中,Wireshark无疑是最流行且功能强大的选择,而Sniff Master作为后起之秀,也因其简洁高效的特点受到许多专…...
Outlook客户端无法连接到服务器,添加账户显示“无网络连接,请检查你的网络设置,然后重试。[2603]”
1、先切换一下到手机热点或者其他网络,判断是不是现在所连接的网络的问题。如果有VPN代理软件,网银软件,加密软件在后台运行,麻烦退出一下。 2、打开电脑上的 控制面板——网络和Internet——Internet选项——高级——先点击还原…...
LlamaIndex实现RAG增强:融合检索(Fusion Retrieval)与混合检索(Hybrid Search)
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
