图像锐化——非锐化掩膜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.hqwc.cn/news/685546.html

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

相关文章

Spring框架中常见注解

Spring: SpringMVC: RequestMapping用在类上表示所有该类下方法的父路径 RequestParam 做映射,前端请求的参数映射到控制器Controller的处理方法上的参数上。 【当参数需要设置默认值(前端没有发送这个参数)、参数名…

影刀进行shopee商品排名零代码爬取

需要研究shopee平台的排名更新时间段和周期,几分钟用影刀写了一个爬取应用,每10分钟进行一次排名爬取(以fan‘风扇’为例),0代码爬取。 打开’fan’关键词搜索网页;等待网页加载;滚动进一步加载…

Python | Leetcode Python题解之第71题简化路径

题目: 题解: class Solution:def simplifyPath(self, path: str) -> str:names path.split("/")stack list()for name in names:if name "..":if stack:stack.pop()elif name and name ! ".":stack.append(name)re…

问题:IDEA中打包插件,打出来的jar包一直是最原始的代码

问题详情&#xff1a; 我在配置maven的分离式打包时&#xff0c;打出来的jar包运行不含有我新增的代码&#xff08;一直都是旧的&#xff09; 打包配置&#xff1a; pom.xml: <!-- Maven Jar 插件配置 --><plugin><groupId>org.apache.maven.plugins</gr…

在线教程|二次元的福音!一键部署APISR,动漫画质飞跃升级

从守护城市安全的「火眼金睛」&#xff0c;到探索人体奥秘的医学之窗&#xff0c;再到娱乐产业的视觉盛宴&#xff0c;乃至遥望宇宙的卫星视角&#xff0c;超分辨率技术重塑着我们观察世界的新维度&#xff0c;让每一寸画面绽放前所未有的清晰与真实。 近年来&#xff0c;越来…

让GPT们成为我们的小助手:使用ChatGPT来生成测试用数据

让GPT们成为我们的小助手 任务&#xff1a;帮忙生成测试数据 今天本来想做一个测试&#xff0c;所以需要一些测试数据。为了让测试显得更真实&#xff0c;所以希望测试数据看上去就是一份真实的数据&#xff0c;所以我就希望ChatGPT&#xff08;这里是代指&#xff0c;我有使…

ETL中如何执行Python脚本

Python的解读 Python 是一种高级、通用的编程语言&#xff0c;由荷兰程序员吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;于1990年代初设计并发布。Python的设计哲学强调代码的可读性和简洁性&#xff0c;它的语法清晰且表达力强&#xff0c;使得开发者能够以更少的代…

解析Spring中的循环依赖问题:初探三级缓存

什么是循环依赖&#xff1f; 这个情况很简单&#xff0c;即A对象依赖B对象&#xff0c;同时B对象也依赖A对象&#xff0c;让我们来简单看一下。 // A依赖了B class A{public B b; }// B依赖了A class B{public A a; }这种循环依赖可能会引发问题吗&#xff1f; 在没有考虑Sp…

Linux 操作系统多路IO复用

1.多路IO复用 多路I/O复用是通过一种机制&#xff0c;可以监视多个描述符&#xff0c;一旦某个描述符就绪&#xff08;一般是读就绪或者写就绪&#xff09;&#xff0c;能够通知程序进行相应的读写操作。 这个机制能够通过select/poll/eroll等来使用。这些函数都可以同时监视多…

ICode国际青少年编程竞赛- Python-3级训练场-能量状态判断1

ICode国际青少年编程竞赛- Python-3级训练场-能量状态判断1 1、 for i in range(6):Spaceship.step(2)if not Item[i].broken():Spaceship.turnLeft()Spaceship.step(4)Spaceship.turnLeft()Spaceship.turnLeft()Spaceship.step(4)Spaceship.turnLeft()2、 for i in range(6)…

每日一题——力扣27. 移除元素(举一反三)

题目链接&#xff1a;https://leetcode.cn/problems/remove-element/description/ 菜鸡写法&#xff1a; // 函数定义&#xff0c;移除数组nums中所有值为val的元素&#xff0c;并返回新的数组长度 int removeElement(int* nums, int numsSize, int val) {// 如果数组长度为…

聚观早报 | 苹果新款iPad Pro发布;国产特斯拉4月交付量

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月9日消息 苹果新款iPad Pro发布 国产特斯拉4月交付量 iOS 18新功能爆料 真我GT Neo6续航细节 三星Galaxy Z F…