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

news/2024/2/27 20:18:54

文章目录

  • 一:高斯函数
    • (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.ppmy.cn/news/97904.html

相关文章

Redis系列--redis持久化

一、为什么需要持久化 redis本身运行时数据保存在内存中,如果不进行持久化,那么在redis出现非正常原因宕机或者关闭redis的进程或者关闭计算机后数据肯定被会操作系统从内存中清掉。当然,redis本身默认采用了一种持久化方式,即RD…

Java经典笔试题—day14

Java经典笔试题—day14 🔎选择题🔎编程题🍭计算日期到天数转换🍭幸运的袋子 🔎结尾 🔎选择题 (1)定义学生、教师和课程的关系模式 S (S#,Sn,Sd,Dc,SA )(其属性分别为学号、姓名、所…

vuex五大核心、辅助函数

一、vuex五大核心 分别为:state、getters、mutations、actions、modules state:用来存放我们的状态,也可以理解数据,类似与data中定义的数据;mutations:可以获取state里面的状态,进行修改,他只…

MySQL锁的分类

MySQL锁的分类 全局锁 表级锁 ● 表锁 ● 元数据锁,Meta Data Lock,MDL锁 ● 意向锁 ● AUTO_INC 锁 行级锁(Innodb引擎牛比的地方) ● record lock,记录锁,也就是仅仅把一条记录给锁上了 ● gap lock,间隙锁&#xff…

如何成功申请计算机软件著作权【申请流程完整记录】

致谢 :此博文的编写包括软著的申请,均借鉴了大佬【万里守约】的博客,很幸运一次性通过 — 提示:此博文仅适合个人申请,因为我是自己一个人的项目,自己一个人申请软著 文章目录 前言:一、网站注册…

微服务开发系列 第八篇:Elasticsearch

总概 A、技术栈 开发语言:Java 1.8数据库:MySQL、Redis、MongoDB、Elasticsearch微服务框架:Spring Cloud Alibaba微服务网关:Spring Cloud Gateway服务注册和配置中心:Nacos分布式事务:Seata链路追踪框架…

烟火识别智能监测系统 yolov5

烟火识别智能监测系统基于pythonyolov5网络模型算法智能分析技术,烟火识别智能监测算法模型对现场画面进行实时分析,发现现场出现烟火立即抓拍实时告警。我们选择当下卷积神经网络YOLOv5来进行火焰识别检测。6月9日,Ultralytics公司开源了YOL…

每日学术速递5.28

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.Improving Factuality and Reasoning in Language Models through Multiagent Debate 标题:通过多主体辩论改进语言模型中的事实性和推理 作者:Yilun Du,…

调研:huggingface-diffusers

1. Diffusers能带来什么 1.1 Overview Diffusers是集成state-of-the-art预训练diffusion模型库,用于生成图像、音频甚至3D结构。 Diffusers库注重可用性而非高性能。 Diffusers主要提供三项能力: State-of-the-art diffusion pipelines,…

分治入门+例题

目录 🥇2.3.2 合并排序 🥇2.3.3 快速排序 🌼P1010 [NOIP1998 普及组] 幂次方 🌳总结 形象点,分治正如“凡治众如治寡,分数是也”,管理少数几个人,即可统领全军 本质&#xff…

分布式事务的21种武器 - 7

在分布式系统中,事务的处理分布在不同组件、服务中,因此分布式事务的ACID保障面临着一些特殊难点。本系列文章介绍了21种分布式事务设计模式,并分析其实现原理和优缺点,在面对具体分布式事务问题时,可以选择合适的模式…

【数据湖仓架构】数据湖和仓库:范式简介

是时候将数据分析迁移到云端了——您选择数据仓库还是数据湖解决方案?了解这两种方法的优缺点。 数据分析平台正在转向云环境,例如亚马逊网络服务、微软 Azure 和谷歌云。云环境提供了多种好处,例如可扩展性、可用性和可靠性。此外&#xff0…

【RTE】http 请求实现过程及其回调处理

每次发起一个请求,注册一个cb,都能有cb 被异步触发以下是实现过程:CallFetch 发起一个请求并能回调请求结果 template <typename DT, typename DP> void CallFetch(agora::agora_refptr<IDataParam> param,DataRequestType req_type,ApiType api_type,utils::w…

设计模式总结

java的设计模式大体上分为三大类&#xff1a;创建型模式&#xff08;5种&#xff09;&#xff1a;工厂方法模式&#xff0c;抽象工厂模式&#xff0c;单例模式&#xff0c;建造者模式&#xff0c;原型模式。 结构型模式&#xff08;7种&#xff09;&#xff1a;适配器模式&…

《数据库》期末考试复习手写笔记-第11章 并发控制(锁)【10分】

目录 知识点&#xff1a;封锁活锁死锁可串行化调度 考题1&#xff1a;可串行化调度 考题2&#xff1a;调度正确判断&共享锁写锁 考题3&#xff1a; 事务调度死锁 知识点&#xff1a;封锁活锁死锁可串行化调度 考题1&#xff1a;可串行化调度 考题2&#xff1a;调度正确判…

关于Netty的一些问题

1.Netty 是什么&#xff1f; Netty是 一个异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可维护的高性能协议服务器和客户端。Netty是基于nio的&#xff0c;它封装了jdk的nio&#xff0c;让我们使用起来更加方法灵活。 2.Netty 的特点是什么&#xff1f; 高并发&…

路由原理及vue实现动态路由

路由原理 在前端开发中&#xff0c;路由通常用于实现 SPA 应用程序&#xff0c;即在一个页面中切换不同的内容或页面&#xff0c;而不需要重新加载整个页面。路由的实现原理是通过监听 URL 的变化&#xff0c;然后根据不同的 URL 加载不同的内容或页面。 在前端框架中&#x…

关键词搜索1688商品数据采集、1688商品列表数据接口

1688&#xff1a;指中国最大的电子商务综合平台&#xff0c;类似于美国的亚马逊。 关键词&#xff1a;是用于描述检索文档或记录的词语或短语&#xff0c;通常是用户输入的查询信息。 搜索&#xff1a;是在数据库、网页搜索引擎或其他信息存储库中查找信息内容的过程。 商品数…

JavaScript触摸事件

目录 一、touchstart&#xff1a;当手指触摸屏幕时触发。 二、touchmove&#xff1a;当手指在屏幕上滑动时触发。 三、touchend&#xff1a;当手指离开屏幕时触发。 四、touchcancel&#xff1a;当触摸事件被取消时触发&#xff0c;例如突然有来电等中断触摸的情况。 五、…

【SpringBoot教程】SpringBoot+MybatisPlus数据库连接测试 用户收货信息接口开发

⛪ 专栏地址 系列教程更新中 &#x1f680; 文章介绍: SpringBootMybatisPlus组合可以大大加快开发效率&#xff0c;紧接上一篇文章的内容&#xff0c;这篇文章进行数据库的连接与查询测试&#xff0c;并配置日志输出调试 &#x1f680; 源码获取: 项目中的资料可以通过文章底部…
最新文章