opencv-python图像增强三:图像清晰度增强
文章目录
- 一、简介:
- 二、图像清晰度增强方案:
- 三、算法实现步骤
- 3.1高反差保留实现
- 3.2. usm锐化
- 3.3 Overlay叠加
- 四:整体代码实现
- 五:效果
一、简介:
你是否有过这样的烦恼,拍出来的照片总是不够清晰,显得雾蒙蒙的?其实,通过一些简单的技巧,我们可以让这些模糊的照片焕发新生。首先,让我们来了解一下什么是图像清晰度。简单来说,图像清晰度就是指图片中的细节是否清晰可见。一张清晰的照片,细节丰富,边缘分明;而一张模糊的照片,则细节丢失,看起来不够锐利。图像清晰度增强就是指通过一系列算法和技术手段提高图像的视觉效果,使图像中的细节更加清晰,边缘更加锐利,整体图像更加鲜明。
二、图像清晰度增强方案:
二、图像清晰度增强方案:
为了提升图像的清晰度,我们制定了以下增强方案:
高反差保留:首先,我们对原图进行高反差保留处理,这一步骤旨在保留图像中的高频细节,如边缘和纹理,同时过滤掉低频的背景噪声。通过这种方式,图像的细节得到强化,而不会引入额外的噪声。
USM锐化:接着,我们对图像进行USM(Unsharp Masking)锐化处理。USM锐化是一种常用的图像增强技术,它通过增强图像的边缘对比度来提高图像的清晰度。这一步骤将进一步突出图像的细节,使图像看起来更加锐利。
细节图与原图叠加:最后,我们将经过USM锐化处理的细节图与原始图像进行叠加。这一步骤通过合并原始图像的色彩信息和锐化后的细节信息,实现图像清晰度的整体提升。
具体实施步骤如下:
对原图进行小核高斯模糊处理,这一步骤有助于进一步去除图像上的噪声,为后续的细节保留和锐化打下良好的基础。对去噪后的图像应用高反差保留,以保留图像中的细节信息。
对保留细节后的图像进行USM锐化,以增强图像的边缘和细节。将锐化后的细节图与原始图像进行叠加,通过叠加处理,最终的图像既保留了原始色彩,又增强了清晰度和细节。
通过上述方案,我们可以有效地提升图像的清晰度,使图像更加符合视觉审美和实际应用的需求。
三、算法实现步骤
3.1高反差保留实现
高反差保留是一种图像处理技术,它的主要目的是强化图像中的细节和边缘,同时尽量保持图像的整体亮度不变。简而言之,高反差保留的过程如下:
识别反差:首先,算法会分析图像中的每个像素与其周围像素之间的反差程度。反差通常是通过计算像素值的梯度来确定的,梯度越大,反差就越明显。
保留反差:在识别出反差之后,算法会将这些反差信息保留下来。具体来说,就是将那些反差较大的像素点保留其原始值,而将反差较小的像素点(通常是图像的平坦区域)转换为接近中间灰度的值。
融合图像:最后,将经过反差保留处理的图像与原始图像进行融合。这样,原始图像中的低反差区域(如平滑过渡的色彩或亮度区域)会保持不变,而高反差区域(如边缘和细节)则会得到增强。
高反差保留的效果是使图像的细节更加突出,而不会显著改变图像的整体色调。这种技术在图像增强、锐化处理以及艺术效果制作中非常常用
代码如下:
def high_reserve(img, ksize, sigm):# 将输入图像转换为浮点数,以便进行后续的数学运算img = img * 1.0# 使用高斯模糊对图像进行模糊处理,ksize是高斯核的大小,sigm是高斯核的标准差gauss_out = cv2.GaussianBlur(img, (ksize, ksize), sigm)# 计算原始图像与高斯模糊后的图像之差,然后加上128以调整亮度img_out = img - gauss_out + 128# 将图像数据缩放到0到1的范围内,便于后续处理img_out = img_out / 255.0# 饱和处理,防止像素值超出0到1的范围# 创建一个掩码,标记小于0的像素mask_1 = img_out < 0# 创建一个掩码,标记大于1的像素mask_2 = img_out > 1# 将小于0的像素值设置为0img_out = img_out * (1 - mask_1)# 将大于1的像素值设置为1img_out = img_out * (1 - mask_2) + mask_2 # 返回处理后的图像return img_out
3.2. usm锐化
USM(Unsharp Masking,非锐化掩蔽)锐化是一种常用的图像处理技术,用于增强图像的边缘和细节,使图像看起来更加清晰和鲜明。以下是USM锐化的基本原理和步骤:
原理:USM锐化的核心思想是先模糊原图像,然后从原图中减去这个模糊的版本,最后将得到的边缘增强结果与原图混合,以此来提升图像的清晰度。
步骤:
1.高斯模糊:首先,对原始图像应用高斯模糊。这个过程会创建一个模糊版本的图像,模糊的程度由用户设定的半径(radius)参数控制。
2. 边缘提取:接下来,从原始图像中减去模糊的图像。这个操作会突出图像中的边缘和细节,因为这些区域在减法操作后会有较高的对比度。
3. 混合:最后,将提取出的边缘信息与原始图像进行混合。混合的比例由用户设定的数量(amount)参数控制,这个参数决定了锐化效果的强度。
代码如下:
def usm(img, number):# 使用高斯模糊对原始图像进行模糊处理,(0, 0)表示核大小自动根据sigma值计算# number参数是高斯核的标准差sigma,控制模糊的程度blur_img = cv2.GaussianBlur(img, (0, 0), number)# 使用addWeighted函数对原始图像和模糊图像进行混合# 参数1.5和-0.5分别是原始图像和模糊图像的权重,0是加到混合结果上的常数# 这里的权重设置使得混合结果中原始图像的边缘和细节得到增强usm = cv2.addWeighted(img, 1.5, blur_img, -0.5, 0)# 返回USM锐化处理后的图像return usm
3.3 Overlay叠加
Overlay”(叠加)是一种混合模式,它用于将两个图层的内容以特定的方式混合在一起,创造出一系列视觉效果。叠加混合模式通常用于增强图像的对比度和饱和度,同时保留底层图层的细节。
叠加混合模式的效果取决于底层图层的亮度。它根据底层图层的亮度来调整混合图层(即顶层图层)的颜色,遵循以下规则:
1. 当底层图层像素的亮度低于50%时:
叠加混合模式会将顶层图层的颜色与底层图层进行“乘法”混合。这会导致底层较暗的区域变得更暗,从而增强对比度。
2. 当底层图层像素的亮度高于50%时:
叠加混合模式会将顶层图层的颜色与底层图层进行“屏幕”混合。这会导致底层较亮的区域变得更亮,同样增强对比度。
代码实现:
def Overlay(target, blend):# 创建一个布尔型掩码,其中blend小于0.5的像素位置为True,否则为Falsemask = blend < 0.5# 使用掩码对图像进行分区域处理# 当掩码为True时(即blend小于0.5),使用公式2 * target * blend计算混合结果# 当掩码为False时(即blend大于等于0.5),使用公式1 - 2 * (1 - target) * (1 - blend)计算混合结果img = 2 * target * blend * mask + (1 - mask) * (1 - 2 * (1 - target) * (1 - blend))# 返回处理后的图像return img
注:
2 * target * blend * mask:
mask 是一个布尔数组,它表示混合图层 blend 中像素值小于0.5的位置。
当 mask 为 True 时,即 blend 的像素值小于0.5,这个部分会被激活。
2 * target * blend 实现了“乘法”混合效果,这会使得较暗的区域变得更暗,增强对比度。
(1 - mask):
这是一个反掩码,它表示混合图层 blend 中像素值大于等于0.5的位置。
当 mask 为 False 时,即 blend 的像素值大于等于0.5,这个部分会被激活。
(1 - 2 * (1 - target) * (1 - blend)):
这个表达式实现了“屏幕”混合效果,当 blend 的像素值大于等于0.5时应用。
(1 - target) 和 (1 - blend) 分别计算了目标图层和混合图层像素值的补数。
2 * (1 - target) * (1 - blend) 实现了补数的“乘法”混合,然后通过 1 - 取反,得到“屏幕”混合效果,这会使得较亮的区域变得更亮。
四:整体代码实现
import cv2
import numpy as npdef high_reserve(img,ksize,sigm):img = img * 1.0gauss_out = cv2.GaussianBlur(img,(ksize,ksize),sigm)img_out = img - gauss_out + 128img_out = img_out/255.0# 饱和处理mask_1 = img_out < 0mask_2 = img_out > 1img_out = img_out * (1-mask_1)img_out = img_out * (1-mask_2) + mask_2return img_outdef usm(img ,number):blur_img = cv2.GaussianBlur(img, (0, 0), number)usm = cv2.addWeighted(img, 1.5, blur_img, -0.5, 0)return usm
def Overlay(target, blend):mask = blend < 0.5img = 2 * target * blend * mask + (1 - mask) * (1 - 2 * (1 - target) * (1 - blend))return imgimg = cv2.imread(r'F:\traditional_vison\R-C.png')
img_gas = cv2.GaussianBlur(img,(3,3),1.5)
# img = cv2.resize(img,(640,480))
# print(img.shape)
high = high_reserve(img_gas,11,5)
usm1 = usm(high,11)
add = (Overlay(img_gas/255,usm1)*255).astype(np.uint8)cv2.imshow("de_blur",add)
cv2.imshow("img_gas",img_gas)
# add=cv2.medianBlur((add*255).astype(np.uint8),3)
# cv2.imwrite(r"E:\PS\R-C (1).jpg",add)
cv2.waitKey(0)
五:效果
左侧为原始图像,右侧为增强后的图像
相关文章:

opencv-python图像增强三:图像清晰度增强
文章目录 一、简介:二、图像清晰度增强方案:三、算法实现步骤3.1高反差保留实现3.2. usm锐化3.3 Overlay叠加 四:整体代码实现五:效果 一、简介: 你是否有过这样的烦恼,拍出来的照片总是不够清晰ÿ…...

第130天:内网安全-横向移动PTH哈希PTT 票据PTK密匙Kerberos密码喷射
环境搭建 这里这个环境继续上一篇文章搭建的环境 案例一:域横向移动-PTH-Mimikatz&NTLM 什么是pth? PTH Pass The Hash ,通过密码散列值 ( 通常是 NTLM Hash) 来进行攻击。在域环境中,用户登录计算机时使用的域账号&…...

SB3045LFCT-ASEMI无人机专用SB3045LFCT
编辑:ll SB3045LFCT-ASEMI无人机专用SB3045LFCT 型号:SB3045LFCT 品牌:ASEMI 封装:TO-220F 批号:最新 最大平均正向电流(IF):30A 最大循环峰值反向电压(VRRM&…...

RPA财务机器人是什么,RPA的具体应用场景有哪些?| 实在RPA研究
数字化转型关键期,越来越多的人工智能及超自动化技术在企业财务工作中得以普及应用,以提升财务工作效率,促进财务部门实现 RPA财务机器人是什么? RPA,即机器人流程自动化(Robotic Process Automation&#…...

滑动窗口 | Java | (hot100) 力扣 3
力扣 3.无重复字符的最长子串 暴力法:双层for循环,i-j的字符查重 滑动窗口:因为这题被分在这个类别里,那么已知要用滑动窗口,思路应该是什么。 反正我想不出来…… 看了别人的题解写出来的出错点:特别容易…...
【产品经理】竞品分析怎么理解?拆解一下
什么叫竞品?(研究的对象) 竞品看你怎么理解,有时候不一定是你的竞争对手,有可能是其他行业也做了这个功能,那你也可以学习,有类似的功能或者策略都可以学习,不过这个可能在管理学上…...
合规性导航:处理爬虫数据用于机器学习的最佳实践
在数据驱动的时代,机器学习已成为企业和研究者的重要工具。然而,使用爬虫技术抓取的数据进行机器学习时,合规性问题不容忽视。本文将详细探讨在使用爬虫抓取的数据进行机器学习时可能遇到的合规性问题,并提供相应的最佳实践。 一…...

spring中使用到的设计模式有哪些
Spring 框架是一个高度模块化和灵活的框架,广泛使用了各种设计模式来实现其核心功能和架构。这些设计模式帮助 Spring 提供了高可配置性、可扩展性和可维护性。以下是 Spring 框架中使用到的一些关键设计模式:...
splitcontainer控件设置固定大小
要设置SplitContainer控件以固定的大小,可以通过设置SplitContainer的FixedPanel属性来实现。您还需要设置IsSplitterFixed属性为true来锁定分割条的大小,并且通过设置SplitterWidth或SplitterLength属性来调整分割条的宽度或高度。 以下是一个示例代码…...

最近在写的支付模块
最近再写支付模块就到处借鉴 旨在回顾一下。 1.确认订单功能 使用场景是:用户在选择好购物车后,或者是直接选择商品后(选择商品封装为购物车) 这样做是根据尚硅谷来学习的 目前需要这些属性,原因是在确认订单页面后…...

解决域名加别名后再代理或者映射到fastadmin项目
如果遇到微应用不想再添加或者不方便添加单独的二级域名时,就需要用到代理或者映射来进入到我们的微应用项目中。 可以修改route.php路由文件的下面这个参数 __alias__ > [别名 > 模块/控制器] 如图 然后再修改config.php文件里面的view_replace_str参数…...
Armv9.5架构新增的关键扩展--精简版
Armv9.5架构扩展是对Armv9.4的扩展。它增加了强制性和可选的架构特性。有些特性必须一起实现。实现是符合Armv9.5规范,需要满足以下条件: 符合/兼容Armv9.4规范包含所有Armv9.5架构的强制性特性。符合Armv9.5规范的实现还可以包括: Armv9.5的可选特性以下是arm9.5架构中关键…...

STM32 GPIO 模块
B站视频地址:芯片内部GPIO模块细节 引脚 将 STM32 芯片,类比为【大脑】 而旁边的引脚,类比为【神经】 通过引脚,使得,STM32,可以和外部世界,进行交流 比如,当我们和别人说话时&am…...

网络剪枝——network-slimming 项目复现
目录 文章目录 目录网络剪枝——network-slimming 项目复现clone 存储库Baselinevgg训练结果 resnet训练结果 densenet训练结果 Sparsityvgg训练结果 resnet训练结果 densenet训练结果 Prunevgg命令结果 resnet命令结果 densenet命令结果 Fine-tunevgg训练结果 resnet训练结果 …...
Spring 懒加载的实际应用
引言 在 Spring 框架中,懒加载机制允许你在应用程序运行时延迟加载 Bean。这意味着 Bean 只会在第一次被请求时才实例化,而不是在应用程序启动时就立即创建。这种机制可以提高应用程序的启动速度,并节省内存资源。 Spring 的懒加载机制 懒…...

PyQT 串口改动每次点开时更新串口信息
class MainWindow(QWidget, Ui_Form):def __init__(self):super().__init__(parentNone)self.setupUi(self)self.comboBox.installEventFilter(self) # 加载事件过滤器self.comboBox.addItems(get_ports())def eventFilter(self, obj, event): # 定义事件过滤器if isinstance(o…...

三级_网络技术_19_路由器的配置及使用
1.在Cisco路由器上配置DHCP服务,使得客户端可以分配到的地址范围是222.28.71.2-222.28.71.200地址租用时间是2小时30分钟,不记录地址冲突日志默认路由是222.28.71.1,分配的dns服务器地址是222.28126.27和222.28.126.26。以下配置完全正确的是…...

【STM32 Blue Pill编程】-STM32CubeIDE开发环境搭建与点亮LED
开发环境搭建与点亮LED 文章目录 开发环境搭建与点亮LED1、STM32F103C8T6及STM32 Blue Pill 介绍2、下载并安装STM32CubeIDE3、编程并点亮LED3.1 在Stm32CubeIDE中编写第一个STM32程序3.1.1 创建项目3.1.2 设备配置3.1.2.1 系统时钟配置3.1.2.2 系统调试配置3.1.2.3 GPIO配置3.…...

【数据结构】六、图:4.图的遍历(深度优先算法DFS、广度优先算法BFS)
三、基本操作 文章目录 三、基本操作1.图的遍历1.1 深度优先遍历DFS1.1.1 DFS算法1.1.2 DFS算法的性能分析1.1.3 深度优先的生成树和生成森林 1.2 广度优先遍历BFS1.2.1 BFS算法1.2.2 BFS算法性能分析1.2.3 广度优先的生成树和生成森林 1.3 图的遍历与图的连通性 1.图的遍历 图…...

29、号外!号外!ERA5再分析数据下载方式更新啦
文章目录 1. 前言2. 账号注册与协议签署2.1 账号注册2.2 签署CDS-Beta使用条款2.3 更新.cdsapi文件 3. 常见问题与解决方法(持续更新中)3.1 问题1:更新完.cdsapi文件之后,原有下载代码不可以使用3.2 问题2: RuntimeError: 403 Cli…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...