数字图像处理实验记录五(图像的空间域增强-锐化处理)
前言:
文章目录
- 一、基础知识
- 1,什么是锐化?
- 2,为什么要锐化?
- 3,怎么进行锐化?
- 二、实验要求
- 任务1:
- 任务2:
- 任务3:
- 三、实验记录:
- 任务1:
- 任务2:
- 任务3:
- 四、结果展示
- 任务1:
- 任务2:
- 任务3:
- 五、反思总结与收获
- 1,取绝对值:
- 2,取0:
- 总结:
一、基础知识
1,什么是锐化?
百度到:图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。
在我看来,锐化就是将图像的边缘进行增强。
2,为什么要锐化?
既然锐化是将图像边缘增强,那么我认为往往是图像边缘模糊的时候需要进行锐化。在上一个实验中我们学到了平滑处理滤波器,不难发现滤波器往往会在清除噪声的时候让我们的图像变得模糊,所以我认为在我们处理完噪声以后就可以通过锐化来增强边缘。如下:

虽然锐化后不是很清晰,但至少边缘明显了很多
3,怎么进行锐化?
锐化是增强边缘,那么首先我们就要找到边缘,接下来关键的部分就是怎么找边缘了。
什么是边缘?在图像的一个区域内,出现了灰度的突变,突然变小或突然变大,这里突变的中间区域就是边缘。

怎么找边缘?
在计算机里是一个像素一个像素进行处理,怎么处理?这里就提到了几种算子(在我看来就是一种计算的模板方法):

以4领域的Laplacian算子为例:对于一个像素f(i,j),我们就使用它的上下左右四个像素和它自身进行运算得到g(i,j):

如果4领域的像素值都和中心差不多,那么g(i,j)最后的值就是0,显示是黑色,g(i,j)越大,就越白,最后处理完得到的g,就是边缘图像。

边缘检测函数sharpen_value():
function [Ig] = sharpen_value(S,kind)
% 锐化函数 输入S,锐化算子 kind
if(~exist('kind','var'))kind = -1; % 如果未出现该变量,则对其进行赋值
end
[m,n] = size(S);if(kind == -1)%拉普拉斯4H = [0,-1,0;-1,4,-1;0,-1,0];
elseif(kind == 0)%拉普拉斯8H = [-1,-1,-1;-1,8,-1;-1,-1,-1];
elseif(kind == 1)%prewitt 横H = [1,1,1;0,0,0;-1,-1,-1];
elseif(kind == 2)%prewitt 竖H = [1,0,-1;1,0,-1;1,0,-1];
elseif(kind == 3)%Sobel 竖H= [1,2,1;0,0,0;-1,-2,-1];
elseif(kind == 4)%Sobel 竖H= [1,0,-1;2,0,-2;1,0,-1];
elseif(kind == 5)H= [1,0,0;0,-1,0;0,0,0];end
a=1;
S = im2double(S);
Ig =S;for i=2:m-1for j=2:n-1if(kind == 5)Ig(i,j) = abs(S(i,j)-S(i+1,j+1))+abs(S(i+1,j)-S(i,j+1));elseIg(i,j) = 0;for a = -1:1for b = -1:1Ig(i,j) = Ig(i,j)+H(a+2,b+2)*S(i+a,j+b); endendif(Ig(i,j)<0)Ig(i,j) = 0;endendIg(i,j) = uint8(Ig(i,j)*255);end
end
Ig = uint8(Ig);end
最后将边缘图和原图相加,就可以实现边缘增强了。
二、实验要求
任务1:
利用Laplacian 锐化算子(α=-1)对256 级灰度的数字图像进行锐化处理,显示处理前、后图像。
任务2:
在添加了噪声的图像上进行拉普拉斯锐化处理,和未添加噪声图像的处理结果进行比较。
任务3:
分别利用Roberts、Prewitt 和Sobel 边缘检测算子,对数字图像进行边缘检测,计算图像梯度图。显示图像x和y方向偏导图像和梯度幅值图像。
三、实验记录:
任务1:
利用Laplacian 锐化算子(α=-1)对256 级灰度的数字图像进行锐化处理,显示处理前、后图像。
figure('NumberTitle','off','Name','任务1');
I = imread('stone.jpg');
I2 = sharpen_value(I,-1);
I2 = I2+I;
subplot(1,2,1);imshow(I);title('原图');
subplot(1,2,2);imshow(I2);title('增强后');
任务2:
在添加了噪声的图像上进行拉普拉斯锐化处理,和未添加噪声图像的处理结果进行比较。
figure('NumberTitle','off','Name','任务2');
Ib = imnoise(I,'salt',0.02);%添加椒盐噪声
I3 = sharpen_value(Ib,-1);
I3 = I3+Ib;
subplot(1,2,1);imshow(I2);title('原图增强图');
subplot(1,2,2);imshow(I3);title('噪声增强图');
任务3:
分别利用Roberts、Prewitt 和Sobel 边缘检测算子,对数字图像进行边缘检测,计算图像梯度图。显示图像x和y方向偏导图像和梯度幅值图像。
figure('NumberTitle','off','Name','任务3');
I = rgb2gray(I);
H1 = sharpen_value(I,5);
H2 = sharpen_value(I,2);
H3 = sharpen_value(I,3);
subplot(2,2,1.5);imshow(H1);title('Roberts图像梯度图');
subplot(2,2,3);imshow(H2);title('Prewitt x方向偏导');
subplot(2,2,4);imshow(H3);title('Sobel y方向偏导');
四、结果展示
任务1:
利用Laplacian 锐化算子(α=-1)对256 级灰度的数字图像进行锐化处理,显示处理前、后图像。

任务2:
在添加了噪声的图像上进行拉普拉斯锐化处理,和未添加噪声图像的处理结果进行比较。
可以明显看出噪声对锐化的影响很大。
椒盐噪声:

高斯噪声:

任务3:
分别利用Roberts、Prewitt 和Sobel 边缘检测算子,对数字图像进行边缘检测,计算图像梯度图。显示图像x和y方向偏导图像和梯度幅值图像。

五、反思总结与收获
对Laplacian锐化算子的处理结果中,对小于0的部分,采用不同的方法标准化到[0,255]时,图像的显示效果有什么不同?为什么?
在我看来有两种方法来标准化:1,取绝对值。2,取0。
改了改函数,让我们看看效果:
1,取绝对值:

边缘:

2,取0:

边缘:

总结:
取绝对值:负值转正值,会增加对比度,但可能导致某些细节过度增强,看起来更加锐利。会引入图像中的一些噪声或产生不自然的效果。
取0:负值保持为零,因此对比度不会显著增加。这种方法可以保留一些图像细节,但可能不会产生像绝对值标准化那样强烈的锐化效果。
相关文章:
数字图像处理实验记录五(图像的空间域增强-锐化处理)
前言: 文章目录 一、基础知识1,什么是锐化?2,为什么要锐化?3,怎么进行锐化? 二、实验要求任务1:任务2:任务3: 三、实验记录:任务1:任…...
基于水基湍流优化的BP神经网络(分类应用) - 附代码
基于水基湍流优化的BP神经网络(分类应用) - 附代码 文章目录 基于水基湍流优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.水基湍流优化BP神经网络3.1 BP神经网络参数设置3.2 水基湍流算法应用 4.测试结果…...
0010【Edabit ★☆☆☆☆☆】Maximum Edge of a Triangle
【Edabit 算法 ★☆☆☆☆☆】Maximum Edge of a Triangle algorithms math numbers Instructions Create a function that finds the maximum range of a triangle’s third edge, where the side lengths are all integers. Examples nextEdge(8, 10) // 17 nextEdge(5, 7…...
Godot 官方2D C#重构(3):TileMap使用
文章目录 前言Godot Tilemap使用Tilemap使用TileSet和TilemapTilemap 图片资源添加TileSet,开始切图导入图片切图 简单添加TileMap如何使用 Auto Tilemap使用Auto Tilemap 前言 Godot 官方 教程 Godot 2d 官方案例C#重构 专栏 Godot 2d 重构 github地址 Godot Tilem…...
6.DApp-用Web3实现前端与智能合约的交互
题记 用Web3实现前端与智能合约的交互,以下是操作流程和代码。 准备ganache环境 文章地址:4.DApp-MetaMask怎么连接本地Ganache-CSDN博客 准备智能合约 文章地址: 2.DApp-编写和运行solidity智能合约-CSDN博客 编写index.html文件 <!…...
数据异常值检测
数据异常值检测 参考: 数据异常值的检测方法-基于Python 独家 | 每个数据科学家应该知道的五种检测异常值的方法(附Python代码) 异常检测主要方法总结 14种数据异常值检验的方法! 14种数据异常值检验的方法 浅谈数据挖掘中的…...
监听redis键失效事件实现延迟功能
用Redis实现延迟队列,我研究了两种方案,发现并不简单 SpringBoot实现Redis失效监听事件—KeyExpirationEventMessageListener Redis 监听过期的key(KeyExpirationEventMessageListener) 项目背景 需求上说,需要延迟…...
使用UniApp实现视频数组自动下载与播放功能:一步步指导
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
C语言笔试面试必刷题
🎊【面经】专题正在持续更新中,内含C语言,数据结构,Linux,网络编程等✨,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - …...
window11安装Python环境
python环境安装 访问Python官网:https://www.python.org/ 点击downloads按钮,在下拉框中选择系统类型(windows/Mac OS/Linux等) 选择下载最新版本的Python cmd命令如果出现版本号以及>>>则表示安装成功 如果出现命令行中输入python出现如下错误 可能…...
SpringBoot中的日志使用
SpringBoot的默认使用 观察SpringBoot的Maven依赖图 可以看出来,SpringBoot默认使用的日志系统是使用Slf4j作为门户,logback作为日志实现 编写一个测试代码看是否是这样 SpringBootTest class SpringbootLogDemoApplicationTests {//使用Slf4j来创建LOG…...
微信小程序中监听横屏竖屏
直接上代码 第一步:在你想要监听页面的json文件中添加此节点 "pageOrientation": "auto" 第二步:wx.onWindowResize() page({ onLoad() {this.kstd()},kstd(){ // 监听屏幕旋转事件 wx.onWindowResize((res)>{// …...
云原生概述
1. 何谓云原生 云原生是一种构建和运行应用程序的方法,是一套技术体系和方法论。云原生(CloudNative)是一个组合词,CloudNative。Cloud表示应用程序位于云中,而不是传统的数据中心;Native表示应用程序从设…...
消失的它:网络层分片包中的第一个分片包去哪了?
在网络层IP包分片的过程中,遇到了大麻烦! 主机A: IP地址:192.168.0.10/24 MAC地址:02:00:00:00:00:10 主机B: IP地址:192.168.0.20/24 MAC地址:02:00:00:00:00:20 MTU:1…...
LeetCode刷题---有效的括号
这里用到了栈的思想 栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,…...
QT学习笔记-QT访问各种关系数据库笔记汇总
QT学习笔记-QT访问各种关系数据库笔记汇总 1、QT访问Oracle数据库2、QT访问SQLServer数据库3、QT访问MySQL数据库4、QT访问PostgreSQL数据库5、QT访问Access数据库6、QT多线程中访问数据库的要点 在使用QT进行应用开发过程中,不可避免的会涉及到访问关系数据库&…...
Shell脚本-常用命令
Shell 脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。 由于习惯的原因,简洁起见&a…...
Flink之输出算子Redis Sink
Redis Sink Redis Sinkjedis实现添加依赖自定义Redis Sink使用Sink验证 开源 Redis Connector添加依赖自定义Redis SinkRedisCommandString数据类型示例Hash数据类型示例 使用SinkRedisStringSinkRedisHashSink 验证 Redis Sink 在新版Flink的文档中,并没有发现Redi…...
【数据结构】顺序表实现通讯录
前言 在上一节中我们实现了顺序表,现在我们将使用顺序表完成通讯录的实现。(注:本人水平有限,“小屎山”有些许bug,代码冗余且语无伦次,望谅解!😅) 文章目录 一、数据结构…...
JMeter 随机数生成器简介:使用 Random 和 UUID 算法
在压力测试中,经常需要生成随机值来模拟用户行为。JMeter 提供了多种方式来生成随机值,本文来具体介绍一下。 随机数函数 JMeter 提供了多个用于生成随机数的函数,其中最常用的是 __Random 函数。该函数可以生成一个指定范围内的随机整数或…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
Python爬虫(四):PyQuery 框架
PyQuery 框架详解与对比 BeautifulSoup 第一部分:PyQuery 框架介绍 1. PyQuery 是什么? PyQuery 是一个 Python 的 HTML/XML 解析库,它采用了 jQuery 的语法风格,让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...
Neo4j 完全指南:从入门到精通
第1章:Neo4j简介与图数据库基础 1.1 图数据库概述 传统关系型数据库与图数据库的对比图数据库的核心优势图数据库的应用场景 1.2 Neo4j的发展历史 Neo4j的起源与演进Neo4j的版本迭代Neo4j在图数据库领域的地位 1.3 图数据库的基本概念 节点(Node)与关系(Relat…...
