图像增强——传统算法伽马校正实现暗光增强(附Python代码)

news2024/11/29 1:50:43

在这里插入图片描述

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《图像增强》
📝《模型优化》
📝《模型实战部署》
📝《图像配准融合》
📝《数据集》
📝《高效助手》


在这里插入图片描述

伽马校正作为一种传统的图像增强技术,适用于简单的亮度和对比度调整,尤其是在图像整体较暗或者需要快速增强的场景中。但它不适合处理复杂光照场景以及要求精确局部控制的场合。在更复杂的任务中,现代的图像处理方法(如基于深度学习的增强算法)可能更具优势。

目录

  • 一、伽马校正原理
  • 二、伽马校正优缺点
    • 2.1 优点
    • 2.2 缺点
  • 三、伽马校正适用场景
  • 四、伽马校正实例
    • 4.1 代码
    • 4.2 代码解析
      • 4.2.1 查找表生成
      • 4.2.2 像素值替换
    • 4.3 伽马校正结果
  • 五、总结

一、伽马校正原理

伽马校正公式:

输出像素值 I o u t I_{out} Iout通过以下公式计算:
I o u t = ( I i n 255 ) γ × 255 I_{out}=(\frac{I_{in}}{255})^γ × 255 Iout=(255Iin)γ×255

其中 I i n I_{in} Iin是输入的原始像素值, γ γ γ是控制亮度的伽马值。

γ < 1 γ<1 γ<1时,图像整体会变亮,适合用于暗光增强。

γ > 1 γ>1 γ>1时,图像整体会变暗,适合用于高光抑制。

通过调节伽马值,可以让图像的亮部和暗部的对比更明显,增加细节。然而,伽马校正是一种全局调整,可能无法有效应对具有复杂光照条件的场景。

二、伽马校正优缺点

2.1 优点

简单易用:伽马校正是一种计算复杂度低的全局亮度调整方法,适合快速图像处理。

提高图像对比度:尤其在暗光或高对比度场景下,伽马校正可以增强细节,改善图像的视觉效果。

可控性强:通过调整伽马值,可以灵活地控制图像亮度,满足不同的处理需求。

广泛应用:适用于图像和视频中的亮度调整,很多图像处理软件和硬件都内置了伽马校正功能。

2.2 缺点

全局操作:伽马校正对整个图像进行统一的调整,无法对局部光照条件进行细化处理。它无法应对复杂的场景光照变化,特别是同时存在明亮和暗淡区域的图像。

高光损失:对于亮部和高光区域的处理效果不好,可能导致这些部分的细节丢失或者过曝。

无法自动自适应:伽马校正参数需要手动调整,无法根据图像的光照条件自动调整最佳亮度。

颜色偏移:在 RGB 图像中,伽马校正可能会导致颜色偏移,尤其是在过度增强时,这可能会影响图像的颜色平衡。

三、伽马校正适用场景

暗光图像增强:伽马校正广泛用于低光照条件下拍摄的图像。通过调整伽马值,可以提升暗部细节,使图像整体更亮、更清晰。
应用领域:安防监控图像增强、夜间拍摄照片处理、交通摄像头图像处理等。

视频亮度调整:在视频处理中,伽马校正常被用于调整整体视频的亮度,使得视频内容在不同设备或显示器上呈现出适当的亮度效果。
应用领域:电影后期处理、视频剪辑、显示设备校准等。

图像对比度增强:伽马校正可以提高图像的整体对比度,使得图像在视觉上更加生动。在一些高对比度的场景中,可以通过调整伽马值改善图像的观感。
应用领域:摄影后期处理、科学图像分析、卫星遥感图像等。

图像预处理:在某些机器视觉或计算机视觉任务中,伽马校正可以作为图像预处理步骤之一,改善输入图像的质量,使得后续算法(如边缘检测、特征提取)能够更准确地运行。
应用领域:图像分类、目标检测、人脸识别等。

医疗图像处理:在 X 射线、CT 扫描等医疗成像中,伽马校正可以用来调整图像亮度,突出特定组织或器官的细节。
应用领域:医学影像增强、手术图像处理。

四、伽马校正实例

4.1 代码

下面使用 Python 和 OpenCV 来批量处理多张图像,通过调整伽马值进行暗光增强。

其中adjust_gamma 函数:这是实现伽马校正的函数。它通过创建一个查找表(LUT)来对每个像素值进行伽马校正。

enhance_images_in_folder 函数:批量处理文件夹中所有图像,对每张图像应用伽马校正,并将增强后的图像保存在指定的输出文件夹中。

伽马值 gamma_value:伽马值控制亮度增强效果,值越小,图像越亮。你可以根据图像的亮度调整这个值。

伽马校正参数调整:
如果图像过于暗,可以降低伽马值(如 1.5 或更小),以提高亮度。

具体代码见下:

import cv2
import numpy as np
import os

# 伽马校正函数
def adjust_gamma(image, gamma=1.0):
    # 建立查找表:将像素值(0-255)映射到经过伽马调整后的新值
    invGamma = 1.0 / gamma
    table = np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(256)]).astype("uint8")
    
    # 应用查找表来调整图像
    return cv2.LUT(image, table)   # cv2.LUT 是 OpenCV 提供的函数,作用是根据查找表 table 将图像 image 的每个像素值转换为伽马校正后的新像素值。

# 批量处理图像的函数
def enhance_images_in_folder(input_folder, output_folder, gamma=1.5):
    # 如果输出文件夹不存在,创建它
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 遍历输入文件夹中的所有图像
    for filename in os.listdir(input_folder):
        if filename.endswith(".jpg") or filename.endswith(".png") or filename.endswith(".bmp"):
            # 构建图像的完整路径
            img_path = os.path.join(input_folder, filename)
            
            # 读取图像
            image = cv2.imread(img_path)
            
            # 检查图像是否正确读取
            
            if image is None:
                print(f"无法读取图像 {filename}")
                continue
            
            # 进行伽马校正
            enhanced_image = adjust_gamma(image, gamma=gamma)
            
            # 保存处理后的图像
            output_path = os.path.join(output_folder, filename)
            cv2.imwrite(output_path, enhanced_image)
            print(f"已保存增强后的图像:{output_path}")

# 主程序
input_folder = 'path/to/your/input_folder'  # 输入图像文件夹路径
output_folder = 'path/to/your/output_folder'  # 输出增强后的图像文件夹路径
gamma_value = 1.5  # 调整伽马值,越小越亮,适用于暗光增强

# 批量增强图像
enhance_images_in_folder(input_folder, output_folder, gamma=gamma_value)

4.2 代码解析

本小结的代码解析主要讲解一下adjust_gamma()函数,其它部分代码都容易理解。

4.2.1 查找表生成

def adjust_gamma(image, gamma=1.0):
    # 建立查找表:将像素值(0-255)映射到经过伽马调整后的新值
    invGamma = 1.0 / gamma
    table = np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(256)]).astype("uint8")
    
    # 应用查找表来调整图像
    return cv2.LUT(image, table)

在上面代码中,table值为一个一维数组,里面存放了从0到255之间每个数值经过伽马校正公式计算后的数值,即为原像素值通过伽马校正后映射的值,为了更容易理解,见下:

在这里插入图片描述
从上面图中可以看出,经过伽马校正公式处理后,
原像素值为 0 的像素,转换后的值为 0。
原像素值为 1 的像素,转换后的值为 27。
原像素值为 2 的像素,转换后的值为 36。

原像素值为 255 的像素,转换后的值为 255。

table是一个查找表,用于下一步将原图像中对应的像素值替换为伽马校正后的数值。

每个像素值都会根据查找表 table 中的对应索引值进行替换。

4.2.2 像素值替换

代码cv2.LUT(image, table)中cv2.LUT 是 OpenCV 提供的函数,作用是根据查找表 table 将图像 image 的每个像素值转换为伽马校正后。这个过程具体是怎么转换的???

cv2.LUT 函数的具体操作是针对图像中的每一个像素,根据该像素值查找 table 中的对应值,并用这个值替换原始像素值。过程如下:
步骤:

(1)遍历图像中每个像素: cv2.LUT 会遍历 image 图像中每个像素,读取其原始像素值。假设图像中某个像素的值是 x。

(2)查找表查询: 根据像素值 x,在 table 中查找对应的伽马校正后的值,即 table[x]。例如,如果某个像素值为 5,则它会查找 table[5],假设 table[5] = 56,那么这个像素的值会被替换成 56。

(3)像素替换: 将原始像素值 x 替换为 table[x]。这个过程会对图像中的所有像素重复进行。

4.3 伽马校正结果

下面随机挑选了一张用手机拍的现实暗光环境测试伽马校正,见下:

在这里插入图片描述

五、总结

以上就是传统算法伽马校正实现暗光增强解析及方法,其代码中cv2.LUT(image, table) 的操作是基于 查找表索引,将图像 image 中每个像素的值根据 table 中的对应值替换为伽马校正后的值。table 中的每个值对应的是经过伽马校正计算后的结果,所以最终得到的图像是伽马校正后的图像。

感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖

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

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

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

相关文章

OpenSearch迁移方案

一、背景 因业务需要迁移Opensearch 集群&#xff0c;当前集群数据量高达21TB&#xff0c;采用常规工具进行迁移估计不可取&#xff0c;需要使用对象存储做中转&#xff0c;进行OpenSearch数据迁移。 二、OpenSearch迁移方案 前期进行OpenSearch数据迁移调研 序号方案诠释备…

java项目之科研工作量管理系统的设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的科研工作量管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 科研工作…

介绍Java

Java简介 Java是一门由Sun公司&#xff08;现被Oracle收购&#xff09;在1995年开发的计算机编程语言&#xff0c;其主力开发人员是James Gosling&#xff0c;被称为Java之父。Java在被命名为“Java”之前&#xff0c;实际上叫做Oak&#xff0c;这个名字源于James Gosling望向…

Basic Pentesting_ 2靶机渗透

项目地址 plain https://download.vulnhub.com/basicpentesting/basic_pentesting_2.tar.gz 修改静态ip 开机按e 输入rw signie init/bin/bash ctrlx 进入编辑这个文件 vi /etc/network/interfaces修改网卡为ens33 保存退出 实验过程 开启靶机虚拟机 ![](https://img-bl…

paimon,基础查询语句测试

基础设置 -- 创建catalog/加载catalog&#xff0c;如果这个catalog已经存在就不会创建&#xff0c;自动加载元数据信息CREATE CATALOG fs_paimon_catalog WITH ( type paimon, warehouse hdfs://wsl01:8020/paimon/catalog ); -- 使用catalog use catalog fs_paimon_catalog…

Java中二维数组-杨辉三角

使用二维数组打印一个10行杨辉三角 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1&#xff09;第一行有1个元素&#xff0c;第n行有n个元素 2&#xff09;每一行的第一个元素和最后一个元素都是1 3&#xff09;从第三行开始&#xff0c;对于非第一个元素和最后一个元素的元素…

差分注意力,负注意力的引入

文章目录 Differential Transformer差分注意力&#xff0c;负注意力的引入相关链接介绍初始化函数多头差分注意力 Differential Transformer差分注意力&#xff0c;负注意力的引入 相关链接 ai-algorithms/README.md at main Jaykef/ai-algorithms (github.com) unilm/Diff…

response和验证码、文件下载操作

目录 Response对象 案例&#xff1a; 1、完成重定向 2、服务器输出字符输出流到浏览器 3、服务器输出字节输出流到浏览器 4、验证码 ServletContext对象 Response对象 功能&#xff1a;设置响应消息 1、设置响应行 格式&#xff1a;HTTP/1.1 200 ok 设置状态码 se…

RabbitMQ 高级特性——死信队列

文章目录 前言死信队列什么是死信常见面试题死信队列的概念&#xff1a;死信的来源&#xff08;造成死信的原因有哪些&#xff09;死信队列的应用场景 前言 前面我们学习了为消息和队列设置 TTL 过期时间&#xff0c;这样可以保证消息的积压&#xff0c;那么对于这些过期了的消…

【更新】上市公司企业机构投资者实地调研数据(2013-2023年)

一、测算方式&#xff1a; 参考《会计研究》逯东&#xff08;2019&#xff09;老师的做法&#xff0c;考虑投资者实地调研的频率和可能性&#xff0c;设立了下述变量来衡量上市公司接待投资者调研情况: 首先&#xff0c;使用年度范围内接待投资者调研的总次数 ( Visitnmb) 作为…

卸载PLSQL及标准卸载流程

目录 1. 卸载PLSQL2. 删除注册表3. 删除数据信息 1. 卸载PLSQL 等待进度条走完 2. 删除注册表 regedit 右击删除 3. 删除数据信息 由于AppData是隐藏文件&#xff0c;需要勾选隐藏的项目。 重启电脑&#xff0c;PLSQL就卸载成功了。

低代码工单管理app评测,功能与效率解析

预计到2030年&#xff0c;低代码平台市场将达1870亿美元。ZohoCreator助力企业构建定制化软件应用&#xff0c;以建筑行业工作订单管理app为例&#xff0c;简化流程&#xff0c;提升管理效率&#xff0c;降低成本。其用户友好界面、自动化管理、跨平台使用及全面报告功能受企业…

项目优化内容及实战

文章目录 事前思考Prometheus 普罗米修斯概述架构安装及使用 Grafana可视化数据库读写分离实战1-PrometheusGrafanaspringboot 事前思考 需要了解清楚&#xff1a;需要从哪些角度去分析实现&#xff1f;使用了缓存&#xff0c;就需要把缓存命中率数据进行收集&#xff1b;使用…

企业在隔离网环境下如何进行安全又稳定的跨网文件交换?

在数字化时代&#xff0c;企业的数据流通如同血液一般重要。然而&#xff0c;当企业内部实施了隔离网环境&#xff0c;跨网文件交换就成了一个棘手的问题。今天我们将探讨在隔离网环境下&#xff0c;企业面临的跨网文件交换挑战&#xff0c;以及如何通过合规的跨网文件交换系统…

数字电路——触发器1(RS和钟控触发器)

触发器&#xff1a;能够存储一位二进制信息的基本单元电路称触发器(Flip-Flop) 特点&#xff1a; 具有两个能自行保持的稳定状态&#xff0c;用来表示逻辑状态的“0”或“1”。具有一对互补输出。有一组控制(激励、驱动)输入。或许有定时(时钟)端CP(Clock Pulse)。在输入信号…

PostgreSQL 16.4安装以及集群部署

1. 环境准备 1.1 主机环境 主机 IP: 192.24.215.121操作系统: CentOS 9PostgreSQL 版本: 16.4 1.2 从机环境 从机 IP: 192.24.215.122操作系统: CentOS 9PostgreSQL 版本: 16.4 2. 安装 PostgreSQL 16.4 在主从两台机器上都需要安装 PostgreSQL 16.4。 2.1 添加 Postgre…

银行卡基础信息查询 API 对接说明

本文将介绍一种 银行卡基础信息查询 API 对接说明&#xff0c;它可用于银行卡基础信息查询。 接下来介绍下 银行卡基础信息查询 API 的对接说明。 申请流程 要使用 API&#xff0c;需要先到 银行卡基础信息查询 API 对应页面申请对应的服务&#xff0c;进入页面之后&#xf…

Python自定义异常类:实际应用示例之最佳实践

Python自定义异常类&#xff1a;实际应用示例之最佳实践 前言 在软件开发中&#xff0c;合理处理异常是保证程序稳定性的重要环节。虽然 Python 内置了丰富的异常类型&#xff0c;但在处理复杂业务逻辑时&#xff0c;自定义异常类能够使代码更加清晰且具备可扩展性。 本文将…

一个架构师的职业素养:四种常用的权限模型

你好,我是看山。 本文收录在《一个架构师的职业素养》专栏。日拱一卒,功不唐捐。 今天咱们一起聊聊权限系统。 以大家熟知的电商场景举例: 用户可以分为普通用户、VIP用户:我们需要控制不同角色用户的访问范围。比如,京东的PLUS会员,可以进入会员专区,而且能够使用礼金…

ESP32接入扣子(Coze) API使用自定义智能体

使用ESP32接入Coze API实现聊天机器人的教程 本示例将使用ESP32开发板通过WiFi接入 Coze API&#xff0c;实现一个简单的聊天机器人功能。用户可以通过串口向机器人输入问题&#xff0c;ESP32将通过Coze API与智能体进行通信&#xff0c;并返回对应的回复。本文将详细介绍了如…