python 阴暗图像 亮度增强 对比度增强 去雾

news2024/11/16 14:20:05

背景说明

最近在处理图像,发现一些样本由于逆光原因过于阴暗,影响图像识别。解决时,可以在训练样本中加入类似的图像,或者手动把相关图像进行颜色变化。这里主要介绍手工颜色变化。

原始图像如下,假设你需要判断裤子的种类(牛仔裤还或棉布裤子),类似阴暗图像很难判断:

在这里插入图片描述

网上现有的解决方法中,主要包含直方图变化和gamma变换,例如下面几篇文章OpenCV调整图像对比度和亮度、qunshansj/opencv-python-image-dehazing-algorithm
、OpenCV-Python-(4)-对比度增强。

尽管这几篇文章都能起到“给图片增加亮度”的效果,但是gamma变换之后的图像总感觉有一层雾气覆盖,因此又结合了何凯明的去雾算法,最终完成了处理。

处理步骤1-对比度增强

使用gamma增强后,图片中人的右腿的对比度更加强烈,与原始图片相比,已经能够看清右腿上的褶皱,甚至鞋底的花纹都变得更明显。在人眼尺度下,此时基本已经能判断出这是一条棉布裤子
在这里插入图片描述
处理代码如下,其中的gamma可以是0到无穷大,0-1之间较为合理。可以参考这个链接。

import cv2  
import numpy as np 
import math
  

def gamma_trans(img, gamma):  # gamma函数处理
    gamma_table = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)]  # 建立映射表
    gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)  # 颜色值为整数
    return cv2.LUT(img, gamma_table)  # 图片颜色查表。另外可以根据光强(颜色)均匀化原则设计自适应算法。

def process_image_gamma(image_path, output_path, gamma_factor):  
    # 读取图像  
    image = cv2.imread(image_path)  
  
    # 检查图像是否成功读取  
    if image is None:  
        print("Error: 图像无法读取。")  
        return  
  
    # 将图像的像素值转换为float32类型,以便进行数学运算  
    image_float = image.astype(np.float32)  
  
    img_gray = cv2.imread(image_path, 0)  # 灰度图读取,用于计算gamma值

    mean = np.mean(img_gray)
    gamma_val = math.log10(gamma_factor) / math.log10(mean / 255)  # 公式计算gamma

    image_gamma_correct = gamma_trans(image, gamma_val)  # gamma变换
  
    # 保存修改后的图像  
    cv2.imwrite(output_path, image_gamma_correct)  
  
    print("处理完成,图像已保存至:", output_path)  
    

# 使用示例  
image_path = r'E:\data\3.jpg'  # 替换为你的图像路径  
output_path = r'E:\data\3_1.jpg'  # 替换为你希望保存输出图像的路径  
process_image_gamma(image_path, output_path, gamma_factor=0.5)  # 可以调整gamma_factor参数来改变颜色变化的幅度

处理步骤2-去雾

在步骤1中,如果仔细观察,你会发现图片表面仍然有一层类似于雾气的白色覆盖,如果想要进一步处理,就需要用去雾算法了。目前使用何凯明的传统算法就能达到不错的效果:

在这里插入图片描述
如果与文章开始的图片对比,你会发现鞋底花纹、裤子纹路以及原本处于阴暗位置的数目和小草都变得更加容易识别。处理代码如下。你需要把bGamma参数设为true。

import cv2
import numpy as np
def zmMinFilterGray(src, r=7):
    '''最小值滤波,r是滤波器半径'''
    '''if r <= 0:
        return src
    h, w = src.shape[:2]
    I = src
    res = np.minimum(I  , I[[0]+range(h-1)  , :])
    res = np.minimum(res, I[range(1,h)+[h-1], :])
    I = res
    res = np.minimum(I  , I[:, [0]+range(w-1)])
    res = np.minimum(res, I[:, range(1,w)+[w-1]])
    return zmMinFilterGray(res, r-1)'''
    return cv2.erode(src, np.ones((2 * r + 1, 2 * r + 1)))  # 使用opencv的erode函数更高效
def guidedfilter(I, p, r, eps):
    '''引导滤波'''
    height, width = I.shape
    m_I = cv2.boxFilter(I, -1, (r, r))
    m_p = cv2.boxFilter(p, -1, (r, r))
    m_Ip = cv2.boxFilter(I * p, -1, (r, r))
    cov_Ip = m_Ip - m_I * m_p
    m_II = cv2.boxFilter(I * I, -1, (r, r))
    var_I = m_II - m_I * m_I
    a = cov_Ip / (var_I + eps)
    b = m_p - a * m_I
    m_a = cv2.boxFilter(a, -1, (r, r))
    m_b = cv2.boxFilter(b, -1, (r, r))
    return m_a * I + m_b
def getV1(m, r, eps, w, maxV1):  # 输入rgb图像,值范围[0,1]
    '''计算大气遮罩图像V1和光照值A, V1 = 1-t/A'''
    V1 = np.min(m, 2)  # 得到暗通道图像
    V1 = guidedfilter(V1, zmMinFilterGray(V1, 7), r, eps)  # 使用引导滤波优化
    bins = 2000
    ht = np.histogram(V1, bins)  # 计算大气光照A
    d = np.cumsum(ht[0]) / float(V1.size)
    for lmax in range(bins - 1, 0, -1):
        if d[lmax] <= 0.999:
            break
    A = np.mean(m, 2)[V1 >= ht[1][lmax]].max()
    V1 = np.minimum(V1 * w, maxV1)  # 对值范围进行限制
    return V1, A
def deHaze(m, r=81, eps=0.001, w=0.95, maxV1=0.80, bGamma=True):
    Y = np.zeros(m.shape)
    V1, A = getV1(m, r, eps, w, maxV1)  # 得到遮罩图像和大气光照
    for k in range(3):
        Y[:, :, k] = (m[:, :, k] - V1) / (1 - V1 / A)  # 颜色校正
    Y = np.clip(Y, 0, 1)
    if bGamma:
        Y = Y ** (np.log(0.5) / np.log(Y.mean()))  # gamma校正,默认不进行该操作
    return Y

input_path = r'E:\data\3_1.jpg'  # 替换为你的图像路径  
output_path = r'E:\data\3_2.jpg'  # 替换为你希望保存输出图像的路径  

image = cv2.imread(input_path)  

m = deHaze(image / 255.0) * 255
height, width = m.shape[:2]
cv2.imwrite(output_path, m)

其他效果对比

以下两组实验省去了中间过程,只保留了输入图像和最终的图像,都达到了去阴暗的目的。

这是一张风景图,原图中,中间位置的房子基本不可识别,而处理后则可轻易识别出房子。

在这里插入图片描述
在这里插入图片描述

这是一张行人图片,原图可以识别出每一个人物,经过处理后,还可以识别人员身上的衣服花纹,图像右侧边缘正中间的花坛也呈现了更艳丽的紫色。

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

使用 Elasticsearch-DSL Python 客户端简化向量嵌入

作者&#xff1a;来自 Elastic Miguel Grinberg 在本文中&#xff0c;我们将介绍 Python 版 Elasticsearch-DSL 客户端&#xff0c;重点介绍它如何简化构建向量搜索解决方案的任务。 本文附带的代码实现了一个名言数据库。它包括一个使用 FastAPI Web 框架用 Python 编写的后端…

利用http获取文件升级

1.搭建模拟环境 1.电脑端开启Telnet客户端 2.下载HFS文件服务器 Download HFS_2024电脑最新版_HFS官方免费下载_华军软件园 (onlinedown.net) 将要升级的文件放到HFS文件系统中&#xff0c;这里我用了一个test.txt来作为实验 2.通过telnet敲http报文获取HFS服务器中的文件…

拼车系统功能案例分析

拼车系统功能案例分析可以从多个维度进行&#xff0c;以下是一个综合性的分析 一、用户注册与登录 功能描述&#xff1a;用户可以通过手机号、微信、QQ等多种方式轻松注册登录&#xff0c;并支持实名认证以增强身份真实性。案例分析&#xff1a;以T5出行拼车平台为例&#xff…

珂艾泰克拧紧控制器维修方法多样化

珂艾泰克拧紧控制器作为精密工业设备的关键组件&#xff0c;其稳定运行对于保证生产效率和产品质量至关重要。然而&#xff0c;在实际应用中&#xff0c;可能会因各种原因出现CORETEC拧紧控制器故障&#xff0c;影响生产线的正常运行。 【常见CORETEC拧紧控制器故障及原因分析】…

借助帕累托图减少设备停机时间:将非生产时间最小化

虽然全球通胀趋于稳定&#xff0c;但各行业仍能感受到2022年和2023年价格快速上涨的残余影响。对于石油和天然气公司来说&#xff0c;运营成本(包括设备、材料和劳动力)的上升加剧了财务压力。在这个竞争激烈的市场中&#xff0c;减少非生产时间(NPT)对于保持盈利能力至关重要。…

分享五种mfc140.dll丢失如何修复?五种修复错误的详细解决办法

在Windows操作系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;文件扮演着至关重要的角色&#xff0c;它们为应用程序提供了共享的函数和资源。其中&#xff0c;mfc140.dll是Microsoft Visual C 2015 Redistributable Package的一部分&#xff0c;对于许多使用Microso…

会话管理

目录 一、为什么使用会话 二、cookie 1.概述 2.使用 &#xff08;1&#xff09; servletA向响应中增加Cookie &#xff08;2&#xff09;浏览器访问ServletA响应回来的响应报文携带cookie &#xff08;3&#xff09;浏览器访问ServletB&#xff0c;将携带cookie的请求报…

探索ORM宇宙:MyBatis-Plus的力量

**技术派项目源码地址 : ** **Gitee : 技术派 - https://gitee.com/itwanger/paicoding**Github : 技术派 - https://github.com/itwanger/paicoding **Mybatis-Plus 官网 : **MyBatis-Plus &#x1f680; 为简化开发而生 (baomidou.com) 整合Mybatis-Plus 引入依赖 <…

Flink之SQL client使用案例

Flink的执行模式有以下三种: 前提是我们已经开启了yarnsession的进程&#xff0c;在下图中可以看到启动的id也就是后续任务需要通过此id进行认证&#xff0c;以及任务分配的master主机。 这里启动时候会报错一个ERROR&#xff1a;org.apache.flink.shaded.curator.org.apache…

风电场风机安全监测系统解决方案

建设背景 随着风电产业的快速发展&#xff0c;风力发电已成为一种重要的清洁能源形式。风电场中的风塔是支撑风力发电机组的重要结构&#xff0c;其安全稳定运行对于风电场的正常运营和发电效率至关重要。然而&#xff0c;风塔常常面临风载、震动、腐蚀等多种外部因素的影响&a…

一键切换全球优质Linux 系统软件源及 Docker 源,轻松安装 Docker —— 适配广泛、零门槛、超强功能的开源脚本!

概述 linuxMirrors开源脚本为 GNU/Linux 系统用户提供了强大的工具,帮助用户轻松更换系统软件源并安装 Docker。脚本适配了多种国内外镜像站,经过测试具备良好的下载速度和 IPv6 兼容性,并且还包括了中国大陆教育网镜像站的选项。无需技术背景,文档提供了详尽的操作指引和常…

telegraf、influxdb、grafana安装配置及后端监听器操作

InfluxDB&#xff08;时序数据库&#xff09;&#xff0c;常用的一种使用场景&#xff1a;监控数据统计。 grafana&#xff0c;用作监控页面的前端展示。 telegraf&#xff0c;数据采集器。 ITG及快捷启动百度网盘&#xff1a;百度网盘 链接: 提取码: 0000 其他地址链接&am…

pycharm2023.1破解

下载解压文件&#xff0c;文件夹 /jetbra 复制电脑某个位置 注意&#xff1a; 补丁所属文件夹需单独存放&#xff0c;且放置的路径不要有中文与空格&#xff0c;以免 Pycharm 读取补丁错误。 点击进入 /jetbra 补丁目录&#xff0c;再点击进入 /scripts 文件夹&#xff0c;双…

JAVA中的网络编程巨详解(2w字)

在学习 Java 网络编程之前&#xff0c;我们先来了解什么是计算机网络。 计算机网络是指两台或更多的计算机组成的网络&#xff0c;在同一个网络中&#xff0c;任意两台计算机都可以直接通信&#xff0c;因为所有计算机都需要遵循同一种网络协议。 下面是一张简化的网络拓扑图…

【Unity开发】几种空值判断的性能测试

【Unity开发】几种空值判断的性能测试&#xff09; 项目优化过程中&#xff0c;一个非常细节的优化&#xff0c;就是在项目数据处理过程中&#xff0c;会用大量的null和“”空值的判断&#xff0c;参考了一些网友说的性能差别很大&#xff0c;是不是真的需要优化的问题&#xf…

Kafka【一】Windows下安装单节点Kafka

① 下载 下载软件安装包&#xff1a;kafka_2.12-3.6.1.tgz&#xff0c;下载地址&#xff1a;https://kafka.apache.org/downloads 这里的3.6.1&#xff0c;是Kafka软件的版本。截至到2023年12月24日&#xff0c;Kafka最新版本为3.6.1。2.12是对应的Scala开发语言版本。Scala2…

html+css+js实现盒子

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>禁止打开盖子</title><style>* {box-sizing: border-box;-webkit-font-smoothing: antialiased;t…

OAuth2-0协议安全学习

有一个问题困扰了很久很久&#xff0c;翻来覆去无法入眠&#xff0c;那就是OAuth2.0有什么安全问题啊 OAuth2.0是一种常用的授权框架&#xff0c;它使网站和 Web 应用程序能够请求对另一个应用程序上的用户帐户进行有限访问&#xff0c;在全世界都有广泛运用 OAuth2.0简介 O…

pygame开发课程系列(6): 游戏优化与发布

第六章 游戏优化与发布 在游戏开发过程中&#xff0c;优化性能和正确发布是至关重要的步骤。本章将探讨如何提升游戏性能&#xff0c;以及如何将游戏打包成独立的可执行文件&#xff0c;以便于分发和使用。 6.1 性能优化 优化游戏性能可以提升用户体验&#xff0c;确保游戏…

非标零部件加工:满足个性化需求的关键

在现代制造业中&#xff0c;非标零部件加工正逐渐成为满足个性化需求的关键环节。随着各行各业对产品独特性和定制化的要求不断提高&#xff0c;传统的标准零部件已经无法完全满足市场的多样化需求。时利和将分享关于非标零部件加工是如何满足个性化需求的。 非标零部件加工的核…