图像锐化——非锐化掩膜USM和锐化掩膜SM(附代码)

非锐化掩膜 (USM) 和锐化掩膜 (SM) 都是常用的图像锐化技术。它们都可以通过增强图像的边缘信息来提高图像的清晰度。

目录

  • 一、非锐化掩膜USM
    • 1.1 USM原理
    • 1.2 USM实现步骤
    • 1.3 优点
    • 1.4 代码
  • 二、锐化掩膜SM
    • 2.1 SM原理
    • 2.2 SM实现步骤
    • 2.3 优点
    • 2.4 代码
  • 三、锐化效果
  • 四、总结
    • 4.1 效果对比分析
    • 4.2 应用场景建议
    • 4.3 结语

一、非锐化掩膜USM

1.1 USM原理

非锐化掩膜 (USM) 的基本原理是:先用低通滤波器对图像进行滤波,得到一个模糊的图像;然后将原始图像与模糊图像相减,得到高频残差图像;最后,将高频残差图像与原图像按一定比例叠加,得到锐化后的图像。

1.2 USM实现步骤

USM实现步骤如下:

(1)低通滤波:首先,使用低通滤波器(如高斯滤波器)对原始图像进行滤波处理,得到低频分量图像。这个低频分量图像相当于原始图像的模糊版本。

(2)计算高频分量:然后,将低频分量图像从原始图像中减去,得到高频分量图像。这个高频分量图像包含了原始图像的细节信息。

(3)放大高频分量:将高频分量图像乘以一个系数(通常大于1),以放大细节信息。

(4)叠加高频分量:最后,将放大后的高频分量图像叠加到原始图像上,得到锐化后的图像。

1.3 优点

USM方法可以去除一些细小的干扰细节和噪声,因此得到的锐化结果通常比直接使用高通滤波器得到的结果更加真实可信。

1.4 代码

使用下面代码,学者修改导入图像路径,还有权重,卷积核大小等参数,自行调整对比效果。

import cv2
import numpy as npdef usm_sharpen(image, radius, amount, threshold):"""使用非锐化掩膜 (USM) 锐化图像。参数:image: 输入图像。radius: 低通滤波器的半径。amount: 锐化程度。threshold: 阈值。返回值:锐化后的图像。"""# 使用高斯滤波器进行滤波blurred = cv2.GaussianBlur(image, (radius, radius), 0)# 计算高频残差图像residual = cv2.subtract(image, blurred)# 创建掩膜mask = cv2.absdiff(image,blurred) * 255 > thresholdmask = mask.astype(np.float32)# 创建软掩膜soft_mask = cv2.GaussianBlur(mask,(radius, radius), 0)# 锐化后图像sharpened = cv2.addWeighted(image,1,residual,amount,0)# 限制像素值在0到255之间sharpened = np.clip(sharpened, 0, 255).astype(np.uint8)print(sharpened.shape)print(image.shape)# 将锐化后图像和原始图像加权融合alpha = np.mean(soft_mask)beta = 1 - alpharesult_image = cv2.addWeighted(sharpened,alpha,image,beta,0)return result_image# 读取图像
image = cv2.imread('Images/Visible_Images/0108x3.png')# 锐化图像
radius = 5  # 低通滤波器的半径
amount = 2 # 锐化程度
threshold = 10.0  # 阈值
sharpened_image = usm_sharpen(image, radius, amount, threshold)# 显示锐化后的图像
cv2.imshow("original",image)
cv2.imshow('Sharpened Image', sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、锐化掩膜SM

2.1 SM原理

锐化掩膜(Sharpen Mask,简称SM)是一种图像锐化技术,其基本原理是提取图像的高频分量(即细节信息,如边缘和纹理),然后将这些高频分量放大并叠加到原始图像上,从而增强图像的对比度,使图像看起来更清晰。

2.2 SM实现步骤

SM的实现步骤如下:

(1)提取高频分量:直接使用高通滤波器,得到高频分量。这个高频分量图像包含了原始图像的细节信息。

(2)放大高频分量:将高频分量图像乘以一个系数(通常大于1),以放大细节信息。

(3)叠加高频分量:最后,将放大后的高频分量图像叠加到原始图像上,得到锐化后的图像。

2.3 优点

这种方法的优点是可以直接提取和增强图像的高频分量,从而达到锐化的效果。然而,由于直接提取高频分量可能会放大图像中的噪声,因此在使用SM方法时,通常需要对图像进行预处理,以减小噪声的影响。

2.4 代码

使用下面代码,学者修改导入图像路径,还有权重,卷积核大小等参数,自行调整对比效果。

import cv2
import numpy as npdef sm_sharpen(image, amount=2.0, radius=5.0, threshold=10):# 创建一个高斯模糊的版本的图像blurred = cv2.GaussianBlur(image, (0, 0), radius)# 计算原始图像与模糊图像之间的差异diff = cv2.subtract(image, blurred)# 将差异缩放到指定的量diff = cv2.multiply(diff, np.array([amount]))# 将差异添加回原始图像,以产生锐化效果sharpened = cv2.add(image, diff)# 将结果裁剪到0-255的范围内sharpened = np.clip(sharpened, 0, 255).astype(np.uint8)return sharpened# 读入图像调用函数
img = cv2.imread('Images/Visible_Images/0108x3.png')
sharp_img = sm_sharpen(img)cv2.imshow("sharp_img",sharp_img)
cv2.imshow("original",img)cv2.waitKey()
cv2.destroyAllWindows()

三、锐化效果

下面测试图像,UMS和SM的卷积核大小,权重,滤波器都保持一致。

左图为原图,中间图为USM锐化结果,右图中SM锐化结果。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四、总结

4.1 效果对比分析

SM 和 USM 锐化各有优缺点。SM 锐化效果更强,但容易产生噪声;USM 锐化效果柔和,噪声较少。

在实际应用中,可以根据具体需求选择合适的锐化方法。

如果需要强烈的锐化效果,可以选择 SM 锐化。但需要注意控制锐化程度,避免产生过多的噪声。
如果需要柔和的锐化效果,可以选择 USM 锐化。

4.2 应用场景建议

对于人像照片,建议使用 USM 锐化,可以保留更多皮肤细节。

对于风景照片,可以选择 SM 或 USM 锐化,具体取决于需要的锐化程度。

对于线条图或文本图像,不建议使用锐化,因为锐化可能会使线条或文本变得模糊。

4.3 结语

以上就是非锐化掩膜USM和锐化掩膜SM的详细讲解过程,学者自己多调参对比看看,实际的锐化效果比我上传到博文中图片更好一些。

总结不易,多多支持,谢谢!

感谢您阅读到最后!关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!

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

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

相关文章

Jupyter集成AI环境搭建@miniconda@FreeBSD

首先安装jupyter pip install jupyter启动jupyter notebook jupyter notebook然后会自动打开网页:http://localhost:8888/tree 开始干活! 启动jupyter lab jupyter lab自动打开网页:http://localhost:8888/lab 开工,干活&am…

Qt三方库:QuaZIP介绍、编译和使用

前言 Qt使用一些压缩解压功能,探讨过libzip库,zlib库,libzip库比较原始,还有其他库,都比较基础,而在基础库之上,又有高级封装库,Qt中的QuaZIP是一个很好的选择。Quazip是一个用于压缩…

5.11学习记录

20长安杯部分 检材 1 的操作系统版本 CentOS Linux 7.6.1810 (Core) 检材 1 中,操作系统的内核版本是 3.10.0-957.el7.x86_64 检材 1 中磁盘包含一个 LVM 逻辑卷,该 LVM 开始的逻辑区块地址(LBA)是 2099200 物理卷&#xff…

20240510每日后端---聊聊文件预览,doc,image,ppt转PDF预览

一、引入依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>15.8</version></dependency><dependency><groupId>com.aspose</groupId><artifactId>crac…

(Mac)RocketMQ的本地安装测试(详细图示)

目录 部署服务 namesrv / broker下载解压缩运行 namesrvnohup ./bin/mqnamesrv & 启动命令详解运行 broker 测试收发消息运行自带的生产者测试类运行自带的消费者测试类 部署 Dashboard 可视化下载打包运行访问 部署服务 namesrv / broker 下载解压缩 官网下载 https://r…

mac苹果电脑卡顿反应慢如何解决?2024最新免费方法教程

苹果电脑以其稳定的性能、出色的设计和高效的操作系统&#xff0c;赢得了广大用户的喜爱。然而&#xff0c;随着时间的推移&#xff0c;一些用户会发现自己的苹果电脑开始出现卡顿、反应慢等问题。这不仅影响使用体验&#xff0c;还会影响工作效率。那么&#xff0c;面对这些问…

FPGA -手写异步FIFO

一&#xff0c;FIFO原理 FIFO&#xff08;First In First Out&#xff09;是一种先进先出的数据缓存器&#xff0c;没有外部读写地址线&#xff0c;使用起来非常简单&#xff0c;只能顺序写入数据&#xff0c;顺序的读出数据&#xff0c;其数据地址由内部读写指针自动加1完成&a…

指针(4)有点难

指针&#xff08;4&#xff09; 来做个简单的回顾&#xff1a; 指针数组&#xff1a; 1.是数组 2.是存放指针的数组 char* arr1[5]; int*arr2[3]; 数组指针&#xff1a; 1 .是指针 2 .指向数组的指针 字符指针&#xff1a;char*pc; 整型指针&#xff1a;int*pi; int …

win10无法被远程桌面连接,Win10系统无法被远程桌面连接的原因有哪些

win10无法被远程桌面连接&#xff0c;Win10系统无法被远程桌面连接的原因有哪些&#xff1f; 先&#xff0c;我们需要明确Win10系统无法被远程桌面连接的可能原因。其中&#xff0c;最常见的原因包括&#xff1a;远程桌面功能未启用、网络连接问题、防火墙或安全软件设置不当、…

哪个牌子的电视盒子好用?小编分享最新电视盒子排名

最近电视盒子是大家热议的话题&#xff0c;就目前来看它的地位依然无可替代&#xff0c;但许多朋友硬不知道哪个牌子的电视盒子好用&#xff0c;面对众多品牌和产品究竟要如何选择才是最好的呢&#xff1f;本期小编要分享最新发布的电视盒子排名&#xff0c;看看哪些电视盒子最…

C++ 抽象与封装

一 抽象 抽象实例&#xff1a;时钟 数据抽象&#xff1a; 具有表面当前时间的时、分、秒 行为抽象&#xff1a; 具有设置时间和显示时间两个最基本的功能。 抽象实例&#xff1a;人 数据抽象&#xff1a;姓名、年龄、性别等。 行为抽象&#xff1a; 生物属性&#xff1a;吃…

【线性代数】英语版听课笔记

线性代数 - 北京航天航空大学&#xff08;英文版&#xff09;_哔哩哔哩_bilibili 39.concept of vector space in this lecture we will studyvector space&#xff0c; the concept of basis dimension and coordinates 向量空间的维数&#xff1a;向量空间的基底所含向量的…

TCP超时重传机制

一、TCP超时重传机制简介 TCP超时重传机制是指当发送端发送数据后&#xff0c;如果在一定时间内未收到接收端的确认应答&#xff0c;则会认为数据丢失或损坏&#xff0c;从而触发重传机制。发送端会重新发送数据&#xff0c;并等待确认应答。如果在多次重传后仍未收到确认应答&…

车载测试__公司面试题(整理)

案例1&#xff1a; 镁佳 外包岚图汽车 车载测试 区域经理视频面试 1.首先自我介绍一下 2.项目是怎么测的举例说明 3.你是怎么看待加班的 4.你是怎么看待驻场单位 5.是否可以接受外派去做一段时间的技术支持&#xff0c;比如去襄阳&#xff0c;最长一个月。 6.多快能到…

Codigger:优化Vim编辑器的关键是可视化

Vim是一款高度灵活的文本编辑器&#xff0c;以其高效的快捷键和命令行界面而闻名。然而&#xff0c;对于一些初学者来说&#xff0c;Vim的复杂性和强大的功能可能会让他们感到困惑。为了使Vim更易于使用&#xff0c;Codigger引入可视化操作的概念&#xff0c;将原本抽象的、难以…

初步了解json文件

来自wetab 的AI pro: JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式&#xff0c;但是它使用了类似于编程语言&#xff08;特别是J…

智慧公厕,运用数据提升公共厕所管理水平!

随着城市人口的增加和生活水平的提高&#xff0c;公共厕所的管理变得越来越重要。传统的厕所管理方式已经无法满足人们对卫生、便利和舒适的需求。而智慧公厕作为新一代公厕管理方式&#xff0c;通过运用数据技术和大数据分析手段&#xff0c;彻底改变了公厕管理的模式&#xf…

Maximo 在 Automation Script 中访问数据库

在 Automation Script 中我们通常使用 mbo 对象来操作数据&#xff0c;但有时候当数据量较大时&#xff0c;使用 mbo 对象来操作数据会比较慢。这时候&#xff0c;我们可以使用 JDBC 的方式来直接访问数据库&#xff0c;从而提高操作数据的效率。 下面看看使用 JavaScript 脚本…

2024OD机试卷-执行任务赚积分 (java\python\c++)

题目:执行任务赚积分 题目描述 现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。 每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。 可用于处理任务的时间有限,请问在有限的时间内,可…

C++对象的赋值

同类的对象之间可以互相赋值&#xff0c;即一个对象的值可以赋值给另一个对象。对象之间的赋值通过“”进行。默认就是把一个对象所有非static数据成员的值依次赋值给另一个对象。 对象赋值的一般形式为&#xff1a; 对象名1 对象名2; 注意:对象名1和对象名2必须是属于同一个…