图像锐化——非锐化掩膜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 np

def 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 > threshold
    mask = 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 - alpha
    result_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 np

def 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.mfbz.cn/a/610776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue 代码样式问题

部分电脑存在样式错乱问题&#xff0c;部分电脑样式正常。最后发现是样式写在 el-col 里面导致的。 注意&#xff1a;写样式不要放在 el-row 或者 el-row &#xff0c;导致部分电脑会出现莫名其妙的样式问题 <el-row class"detail"><el-col class"it…

在RK3588开发板使用FFMpeg 结合云服务器加SRS实现摄像头数据推流到云端拱其他设备查看

今天测试了一把在开发板把摄像头数据推流到云端服务器&#xff0c;然后给其他电脑通过val软件拉取显示摄像头画面&#xff0c;浅浅记录一下大概步骤 1.开发板端先下载ffmpeg apt install ffmpeg2.云服务器先安装SRS的库 云服务器我使用ubuntu系统&#xff0c;SRS是个什么东西&…

扫码查看文件是如何实现的?文件活码在线生成的方法

现在很多场景下会通过扫码的方式来查看文件&#xff0c;这种方式可以让更多的人同时通过扫码的方式来查看二维码&#xff0c;有利于文件的快速分享以及用户获取内容的个人体验&#xff0c;而且可以保护文件的安全性&#xff0c;那么如何制作文件二维码呢&#xff1f; 文件二维…

车辆管理|基于SprinBoot+vue的4S店车辆管理系统(源码+数据库+文档)

4S店车辆管理系统 目录 基于SprinBootvue的4S店车辆管理系统 一、前言 二、系统设计 三、系统功能设计 系统实现 1管理员功能模块 2销售员功能模块 3维修员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

傻傻分不清楚:JDK/JRE/JVM的区别和联系

在Java开发的世界里&#xff0c;JDK、JRE和JVM是三个经常听到的术语。 对于初学者来说&#xff0c;它们的概念和区别可能会让人感到困惑。 这篇文章详细解释下三个组件的含义、它们之间的区别和联系。 一&#xff0c;JDK&#xff1a;Java Development Kit JDK是Java开发工具…

k8s个人认知理解

pod的定义 pod里面有容器&#xff0c;所以pod就是一个容器组&#xff0c;一个pod里面可以有多个容器也可以有一个容器&#xff0c;最低只能有一个容器&#xff0c;目前现在主流使用的都是一个pod里面一个容器&#xff0c;同一个pod里面的容器&#xff0c;需要紧耦合。配置文件…

重学java 35.API 6.包装类

心有所念&#xff0c;必有所灵 —— 24.5.10 一、基本数据类型对应的引用数据类型(包装类) 1概述 就是基本类型所对应的类&#xff08;包装类&#xff09;&#xff0c;我们需要将基本类型转为包装类&#xff0c;从而让基本类型拥有类的特性&#xff08;是基本类型可以使用包装类…

Excel操作之工具类

需求&#xff1a;根据指定的路径下模版进行解析 将模版上传到指定的文件服务器。 1&#xff1a;将路径下的excel文件进行解析 下载 A:创建excel表格对应的字段注解 ExcelColumn Retention(RetentionPolicy.RUNTIME) Target(ElementType.FIELD) public interface ExcelColumn …

milvus元数据在etcd的存储解析

milvus元数据在etcd的存储解析 数据以key-value形式存在。 大致包含如下一些种类: databasecollectionfieldpartitionindexsegment-indexresource_groupsession database 创建一个数据库会产生2个key&#xff0c;但value是相同的。 key规则: 前缀/root-coord/database/db…

【SRC实战】利用APP前端加密构造数据包

挖个洞先 https://mp.weixin.qq.com/s/ZnaRn222xJU0MQxWoRaiJg “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合” 01 — 漏洞证明 “ 参数加密的情况&#xff0c;不会逆向怎么办&#xff1f;” 1、新用户首次设置密码时抓包&#xff0c;此处设置为0000…

设计合理的IT运维服务目录:打造高效运维的蓝图

在数字化转型的浪潮中&#xff0c;一个设计合理、内容详尽的IT运维服务目录是连接服务提供者与消费者之间的桥梁&#xff0c;它不仅体现了服务设计的专业性&#xff0c;还直接影响着运维效率和服务质量。如何设计出既合理又高效的IT运维服务目录&#xff1f;让我们结合ITIL 4框…

Modown9.1主题无限制使用+Erphpdown17.1插件

Modown9.1主题无限制使用 1、Erphpdown17.1插件Modown9.1主题 2、送Modown主题详细教程。 1、Erphpdown插件和Modown主题无需激活 2、送的插件均无需激活 3、主题插件均不包更新 4、已亲测可以完美使用。 功能强大&#xff0c;适用于绝大多数虚拟资源站&#xff01;物超所值&a…

分布式光伏管理平台功能介绍

一、项目管理系统 1、关键信息&#xff1a;板块化展现项目关键信息&#xff0c;包含所在区域、屋面类型、未来25年发电量、累计收益等信息。 (1) 可迅速获取项目核心要点 (2) 及时跟进修改&#xff0c;凸显项目信息 (3) 项目信息清晰展现&#xff0c;了解整体项目流程 2、项…

【已解决】QT C++中QLineEdit不可粘贴输入

本博文源于生产实际&#xff0c;主要解决LineEdit不可粘贴输入的情况。下面将进行具体分析 问题来源 输入框只能一个个输入&#xff0c;不可复制粘贴。 分析 给QLineEdit装一个监听事件&#xff0c;监听它的事件即可。 问题解决步骤 问题一共分为三步&#xff1a; 书写监…

Find My资讯|苹果设备在修复期间可以保持启用“Find My“功能

iOS 17.5 中有一项名为"维修状态"的新功能&#xff0c;可让送修的设备保持启用"查找我的"&#xff08;Find My&#xff09;功能。此前&#xff0c;用户在送修设备时必须禁用跟踪设备位置的"查找我的"功能&#xff0c;但iOS 17.5发布后&#xff0…

鸿蒙应用开发DevEco Studio工程目录模块介绍

面向开发者&#xff0c;HarmonyOS 推出了 DevEco Studio 和 Dev Device Tool 两款开发工具&#xff0c;前者目前迭代至 3.1 版本&#xff08;对外开放版本&#xff09;&#xff0c;用于开发 HarmonyOS 应用&#xff1b;后者用于开发智能设备 应用的工程主体结构如上图 在这里我…

flutter开发实战-GetX响应式状态管理使用

flutter开发实战-GetX响应式状态管理使用 GetX是一个简单的响应式状态管理解决方案。GetX是Flutter的一款超轻、功能强大的解决方案。它将高性能状态管理、智能依赖注入和路由管理快速而实用地结合在一起。这里简单使用一下GetX 一、引入GetX 在工程的pubspec.yaml中引入插件…

Python中的分布式爬虫系统Scrapy与分布式任务队列的结合

随着互联网的不断发展&#xff0c;网络爬虫在数据采集和信息挖掘中发挥着重要作用。然而&#xff0c;单机爬虫往往难以应对大规模数据抓取的需求&#xff0c;因此&#xff0c;构建分布式爬虫系统成为了一种必然选择。本文将介绍如何利用 Python 中的 Scrapy 框架和分布式任务队…

TikTok自动评论、回复的脚本怎么制作?

在当今数字化的时代&#xff0c;社交媒体平台如TikTok已经成为人们日常生活的一部分&#xff0c;为了更有效地在TikTok上进行营销或互动&#xff0c;许多用户和企业开始寻找自动化工具&#xff0c;如自动评论和回复的脚本&#xff0c;以节省时间并提高效率。 本文将科普如何制…

H5 处理点击元素高亮、自定义按钮、去除焦点边框

1、设置移动设备上点击元素时出现的高亮颜色 *{-webkit-tap-highlight-color: transparent; }2、如果你想要自定义按钮的样式&#xff0c;你可以使用 -webkit-appearance: none; 来移除按钮的默认样式 .button {-webkit-appearance: none;appearance: none; /* 兼容性更好的通…
最新文章