(数字图像处理MATLAB+Python)第七章图像锐化-第三节:高斯滤波与边缘检测

news2025/1/21 9:31:15

文章目录

  • 一:高斯函数
    • (1)定义
    • (2)特点
  • 二:LOG算子
    • (1)定义
    • (2)程序
  • 三:Canny算子
    • (1)最优边缘检测
    • (2)Canny算子
    • (3)程序

一:高斯函数

(1)定义

高斯函数:是一种常见的连续函数,通常用符号 G ( x ) G(x) G(x) 表示。它可以用下面的公式定义

G ( x ) = 1 σ 2 π e − x 2 2 σ 2 G(x)=\frac{1}{\sigma \sqrt{ 2\pi }}e^{-\frac{x^{2}}{2\sigma^{2}}} G(x)=σ2π 1e2σ2x2

其中, x x x 是自变量, σ \sigma σ 是一个正实数,表示高斯函数的标准差。高斯函数具有以下性质:

  • 高斯函数是一个偶函数,即 G ( − x ) = G ( x ) G(-x) = G(x) G(x)=G(x)
  • 高斯函数的曲线呈钟形,且在 x = 0 x=0 x=0 处取得峰值。标准差 σ \sigma σ 越小,高斯函数的峰值越高,曲线越陡峭;标准差 σ \sigma σ 越大,高斯函数的峰值越低,曲线越平缓
  • 高斯函数的面积为 1 1 1,即 ∫ − ∞ ∞ G ( x ) d x = 1 \int_{-\infty}^{\infty} G(x) dx = 1 G(x)dx=1
  • σ \sigma σ 趋近于 0 0 0 时,高斯函数的峰值趋近于无穷大,曲线变得越来越陡峭,趋近于一个 δ \delta δ 函数。 δ \delta δ 函数是一个类似于脉冲的函数,当自变量等于 0 0 0 时,函数值无限大,而在其他位置上函数值都为 0 0 0

以下是高斯函数和其一阶导数形式
在这里插入图片描述

以下是高斯函数二阶导数形式

在这里插入图片描述

(2)特点

在这里插入图片描述

  • 随着远离原点,权值逐渐减小到零,表明离中心较近的图像值比远处的更重要
  • 标准差 σ \sigma σ决定邻域范围,总权值的95%包含在 2 σ 2\sigma 2σ的中间范围内
  • 二阶导数具有光滑的中间突出部分,函数值为负;两个光滑的侧边突出部分,值为正
  • 零交叉位于 − σ -\sigma σ + σ +\sigma +σ处,与 g ( x ) g(x) g(x)的拐点和 g ′ ( x ) g^{\prime}(x) g(x)的极值点对应
  • 1D形式绕垂直轴旋转得各向同性的2D函数形式(在任意过原点的切面上具有相同的1D高斯截面),其二阶导数形式好像一个宽边帽或称为墨西哥草帽
  • 从数学推导上,帽子的空腔口沿 z = g ( x , y ) z=g(x,y) z=g(x,y)轴向上,在显示和滤波应用中空腔口一般朝下,即中间突起的部分为正,帽边为负

二:LOG算子

(1)定义

LOG算子:Marr用高斯函数先对图像作平滑,然后用拉普拉斯算子检测边缘,简称LOG滤波器

LoG ⁡ ( x , y ) = 1 π σ 4 [ 1 − x 2 + y 2 2 σ 2 ] e − x 2 + y 2 2 σ 2 \operatorname{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[12σ2x2+y2]e2σ2x2+y2

LOG算子可以看作是将高斯函数和拉普拉斯算子(即二阶导数算子)结合在一起,因此它的输出是原始图像的拉普拉斯变换与高斯滤波的结果。它可以用来检测图像中的边缘和角点等特征。将 g g g与图像函数 f f f卷积,得到一个平滑的图像函数,对该函数做拉普拉斯运算,提取边缘

可以证明

∇ 2 [ f ( x , y ) ∗ g ( x , y ) ] = f ( x , y ) ∗ ∇ 2 g ( x , y ) \nabla^{2}[f(x, y) * g(x, y)]=f(x, y) * \nabla^{2} g(x, y) 2[f(x,y)g(x,y)]=f(x,y)2g(x,y)

∇ 2 g ( x , y ) = ∂ 2 g ∂ x 2 + ∂ 2 g ∂ y 2 = 1 π σ 4 ( x 2 + y 2 2 σ 2 − 1 ) exp ⁡ ( − x 2 + y 2 2 σ 2 ) \nabla^{2} g(x, y)=\frac{\partial^{2} g}{\partial x^{2}}+\frac{\partial^{2} g}{\partial y^{2}}=\frac{1}{\pi \sigma^{4}}\left(\frac{x^{2}+y^{2}}{2 \sigma^{2}}-1\right) \exp \left(-\frac{x^{2}+y^{2}}{2 \sigma^{2}}\right) 2g(x,y)=x22g+y22g=πσ41(2σ2x2+y21)exp(2σ2x2+y2)

∇ 2 g ( x , y ) \nabla^{2}g(x,y) 2g(x,y)为LOG滤波器,也称为Marr-Hildrech算子

  • σ \sigma σ为尺度因子,大的值可以用来检测模糊边缘,小的值可以用来检测聚焦良好的图像细节

LOG算子的形状如下图所示

在这里插入图片描述

滤波器的大小由 σ \sigma σ的数值或等价地由 ω 2 D \omega_{2D} ω2D的数值来确定。为了不使函数被过分地截短,应在足够大的窗口内作计算,窗口宽度通常取为 ω ≥ 3.6 ω 2 D \omega \geq 3.6\omega_{2D} ω3.6ω2D

σ \sigma σ取不同值时,对应不同模板
在这里插入图片描述

(2)程序

在这里插入图片描述


matlab实现

Image=im2double(rgb2gray(imread('lotus.jpg')));
figure,imshow(Image),title('原图像');
H=fspecial('laplacian',0);
R=imfilter(Image,H);
edgeImage=abs(R);
figure,imshow(edgeImage),title('Laplacian梯度图像');
H1=[0 -1 0;-1 5 -1;0 -1 0];
sharpImage=imfilter(Image,H1);
figure,imshow(sharpImage),title('Laplacian锐化图像');


Python实现

import cv2
import matplotlib.pyplot as plt
import numpy as np

# 读入图像
Image = cv2.imread('lotus.jpg')
Image = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY)
Image = Image.astype(np.float64) / 255.0

# 显示原图像
plt.imshow(Image, cmap='gray')
plt.title('原图像')
plt.show()

# 计算Laplacian梯度图像
H = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]], dtype=np.float64)
R = cv2.filter2D(Image, -1, H)
edgeImage = np.abs(R)

# 显示Laplacian梯度图像
plt.imshow(edgeImage, cmap='gray')
plt.title('Laplacian梯度图像')
plt.show()

# 计算Laplacian锐化图像
H1 = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], dtype=np.float64)
sharpImage = cv2.filter2D(Image, -1, H1)

# 显示Laplacian锐化图像
plt.imshow(sharpImage, cmap='gray')
plt.title('Laplacian锐化图像')
plt.show()

三:Canny算子

(1)最优边缘检测

最优边缘检测:是指在所有边缘检测算法中,能够获得最佳边缘检测结果的算法。然而,没有一种边缘检测算法能够在所有情况下都表现最优,因为不同的算法适用于不同类型的图像和不同的应用场景。因此,我们需要根据具体情况选择最适合的边缘检测算法。最优边缘检测的三个主要评价标准

  • 低错误率:标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。
  • 对边缘的定位准确:标识出的边缘要与图像中的实际边缘尽可能接近。
  • 最小响应:图像中的边缘最好只标识一次,并且可能存在的图像噪声部分不应标识为边缘

(2)Canny算子

Canny算子:是一种广泛使用的边缘检测算法,由John Canny在1986年提出。它可以检测出具有低误差率和高定位精度的边缘,并被认为是目前最优秀的边缘检测算法之一。算法步骤如下

  • 去噪:首先,应该对图像进行高斯滤波,以去除噪声
  • 计算梯度:然后,通过使用Sobel算子计算图像的梯度,以检测出边缘的强度和方向
  • 非极大值抑制:接下来,在梯度方向上进行非极大值抑制,以消除较小的边缘响应和边缘的宽度,保留梯度方向上的局部最大值
  • 双阈值处理:然后,应该根据梯度值进行双阈值处理,将像素点分为强边缘、弱边缘和非边缘三类
  • 边缘连接:最后,应该通过连接强边缘像素点和与其相邻的弱边缘像素点,形成完整的边缘。连接边缘的过程可以使用基于深度优先搜索或者基于连通性分析的方法

Canny算子的优点在于,它具有良好的边缘连接性、单一响应和低误差率。缺点在于计算量较大。此外,Canny算子对参数的选择非常敏感,需要根据具体应用场景进行调整

(3)程序

在这里插入图片描述


matlab实现

Image=im2double(rgb2gray(imread('lotus.jpg')));
figure,imshow(Image),title('原图像');
BW= edge(Image,'canny');
figure,imshow(BW),title('Canny边缘检测');

Python实现

Image=im2double(rgb2gray(imread('lotus.jpg')));
figure,imshow(Image),title('原图像');
BW= edge(Image,'canny');
figure,imshow(BW),title('Canny边缘检测');

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

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

相关文章

前端开发推荐vscode安装什么插件?

前言 可以参考一下下面我推荐的插件,注意:插件的目的是用于提高开发的效率,节约开发的时间,像类似检查一些bug、拼写错误等这些可以使用插件快速的识别,避免在查找错误上浪费过多的时间,但切记不要过度依赖…

高速电路设计阻抗匹配的几种方法

为什么要阻抗匹配? 在高速数字电路系统中,电路数据传输线上阻抗如果不匹配会引起数据信号反射,造成过冲、下冲和振铃等信号畸变,当然信号沿传输线传播过程当中,如果传输线上各处具有一致的信号传播速度,并且单位长度…

AVL和二叉树介绍

AVL tree介绍 AVL的全称是:Adelson-Velsky-Landis,是发明这种高度平衡二叉树的人名的缩写,AVL tree是一种优化了的搜索二叉树。 这是二叉排序树会存在的一个问题,先看案例: 给定一个数列为{1,2,3,4,5,6},将这个数列…

【Blender】学习一下

简介Download使用教程入门常识界面简介编辑器视图Layout游标对物体的操作 实战案例1. 萌三兄弟——建模、渲染2. 积木组合——建模、渲染、动画制作3. 金币基站——建模、渲染4. 狂奔的小车——建模、渲染、动画5. 荧光树桩——雕刻、建模、渲染6. 子弹冲击——建模、渲染、动画…

Hum Brain Mapp | 联合连接矩阵独立成分分析:结构和功能连接的自动链接

导读 对人类大脑连接的研究,包括结构连接(SC)和功能连接(FC),这些方面的研究有助于深入了解大脑功能的神经生理机制及其与人类行为和认知的关系。这两种类型的连接测量都提供了重要且互补的信息。然而,将这两种模式整合到一个单一的框架中仍…

AutoCV番外:Transformer

目录 Transformer前言1. Self-attention1.1 前置知识1.2 Self-attention机制1.3 矩阵乘法角度理解1.4 Multi-head Self-attention1.5 Positional Encoding1.6 Many application 2. Transformer2.1 前置知识2.2 Encoder2.3 AT Decoder2.4 NAT Decoder2.5 Cross attention2.6 Tra…

如何区分比特率、波特率和频谱带宽?

01、什么是比特率和波特率? 宽带网络里面提及的千兆即1000Mbit/s,一般描述的是我们家网络端口每秒最大可接收0、1比特(bit)的数量,即每秒可接收1000x106个比特。显而易见,比特率越高,每秒传送的…

利用resnet50模型实现车牌识别(Python代码,.ipynb和.py两种文件保存都有,可以使用jupyter或pycharm运行)

1.代码的主要流程如下: 导入所需的库和模块。对数据集进行可视化,随机选择一些图像进行展示。加载图像数据集,并将图像和标签存储在数组中。对标签进行独热编码。划分训练集和测试集。使用图像数据增强技术增加训练数据的多样性。定义一些评…

让ChatGPT成为全科医生的智能助理

医生问诊 医疗健康是所有人都关心的话题。涉及医疗健康领域的信息化事件,无论是搜索引擎推荐和广告信息,还是互联网挂号,或者电子商务在线买药,经常能引发社会性讨论。有了 ChatGPT,我们自然也会期待在医疗健康领域&a…

从零开始学习JVM(一)--初识Java虚拟机

1 虚拟机与Java虚拟机 1.1 基本介绍 所谓虚拟机(Virtual Machine)。就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。 系统虚拟机:完全对物理计算…

(赠书活动第1期) Java 8 已无法满足需求?升级到 Java 17 让你体验酣畅淋漓的编程!

Java 8 已无法满足需求?升级到 Java 17 让你体验酣畅淋漓的编程! Java 17 的新特性如何升级到 Java 17❤️‍🔥 本期赠书三本《JAVA核心技术 卷2》 Java 8 是一个历史悠久的版本,自推出以来一直被广泛使用。但是随着时间的推移和技…

四举措实现数电票对企业经营的改善

数电票不仅是征管需求,也是企业业务的需求。 2021年3月,中共中央办公厅、国务院办公厅印发的《关于进一步深化税收征管改革的意见》(以下简称《意见》)提出,要全面推进税收征管数字化升级和智能化改造,把智…

Spark大数据处理讲课笔记4.2 Spark SQL数据源 - 基本操作

文章目录 零、本讲学习目标一、基本操作二、默认数据源(一)默认数据源Parquet(二)案例演示读取Parquet文件1、在Spark Shell中演示2、通过Scala程序演示 三、手动指定数据源(一)format()与option()方法概述…

解密Netty中的Reactor模式

文章目录 单线程Reactor模式多线程Reactor模式Reactor模式中IO事件的处理流程Netty中的通道ChannelNetty中的反应器ReactorNetty中的处理器HandlerNetty中的通道Channel和处理器Handler的协作组件Pipeline Reactor(反应器)模式是高性能网络编程在设计和架构方面的基础模式.Doug…

【MySQL速通篇004】这可能最详细的关于MySQL基础知识点的文章了

🍁前言 👑作者主页:CSDN丨博客园 🏆学习交流:在下周周ovoの社区 💎这篇8000多字的博客也是花了我比较久的时间,基本覆盖很大一部分的MySQL知识点,可以说是非常的详细,感谢…

【我的创作纪念日】IC人仍在路上,不停歇……

机缘 平台今天提示我已经坚持创作3年了。如果不提醒的话,我自己都没什么感觉。三年时间说长也不长,说短呢,其实也不短了。截止今天我在CSDN累计发文213篇,上传资源117个。涉及领域包含:数字信号处理、FPGA设计、IC设计…

【自制视频课程】C++OpnecV基础35讲——序言

OpenCV简介 OpenCV是一个开源的计算机视觉库,它可以用于图像处理、计算机视觉、机器学习等领域。OpenCV最初是由英特尔公司开发的,后来成为了开源项目,现在由OpenCV开源社区维护。OpenCV提供了丰富的图像处理和计算机视觉算法,包括…

【YOLO】Windows 下 YOLOv8 使用 TensorRT 进行模型加速部署

本文全文参考文章为 win10下 yolov8 tensorrt模型加速部署【实战】 本文使用的代码仓库为 TensorRT-Alpha 注:其他 Yolov8 TensorRT 部署项目:YOLOv8 Tensorrt Python/C部署教程 一、前期准备工作 安装Visual Studio 2019或者Visual Studio 2022、Nvidi…

Shell脚本文本三剑客之awk编辑器(人类从不掩饰探索星空的愿望)

文章目录 一、awk简介二、awk工作原理三、awk命令格式四、awk命令的使用1.print操作按行输出文本2.print操作按字段截取输出文本3.使用BEGIN和END指定操作5.使用操作getline6.使用操作OFS7.配合数组使用 一、awk简介 awk是linux的一个强大的命令,具备强大的文本格式…

puppeteer-不需重构,无痛加强vue单页面应用的SEO,提升百度收录排名

背景 最近产品觉得我们网站在百度收录上排名太靠后了,又不肯花钱,就让我们想办法提升网站的SEO。由于项目是用vue3写的,并且已经迭代多个版本了,用nuxt实在不适宜,当然俺的开发水平也不够,周期也会拉得很长…