opencv祛除高光

news2024/12/25 0:13:43

代码是直接借鉴的Opencv去除高光_SkyrimDragonBorn的博客-CSDN博客

原博客是c++,我这边只是使用python进行翻译了一下

import cv2
import numpy as np

img = cv2.imread('xxx.jpg')


def highlight_remove(img):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32)#一定要转换成float32,否则会出错
    # img = cv2.resize(img, (512, 512)).astype(np.float32)#如图片分辨率较大,直接resize到512会比较快
    dst = img.copy()
    h, w = img.shape[:2]
    for i in range(h):
        for j in range(w):
            R = img[i, j, 0]
            G = img[i, j, 1]
            B = img[i, j, 2]
            alpha_r = R/(R+G+B)
            alpha_g = G/(R+G+B)
            alpha_b = B/(R+G+B)
            # alpha = max(max(alpha_r, alpha_g), alpha_b)
            MaxC = max(max(R, G), B)
            minalpha = min(min(alpha_r, alpha_g), alpha_b)
            gama_r = (alpha_r - minalpha) / (1 - 3 * minalpha)
            gama_g = (alpha_g - minalpha) / (1 - 3 * minalpha)
            gama_b = (alpha_b - minalpha) / (1 - 3 * minalpha)
            gama = max(max(gama_r, gama_g), gama_b)

            temp = (gama * (R + G + B) - MaxC) / (3 * gama - 1)
            dst[i, j, 0] = np.clip(R-(temp+0.5), 0, 255)
            dst[i, j, 1] = np.clip(G-(temp+0.5), 0, 255)
            dst[i, j, 2] = np.clip(B-(temp+0.5), 0, 255)
    return dst[:, :, ::-1]


res = highlight_remove(img)
res = np.clip(res, 0, 255)
cv2.imwrite('xxx_remove.jpg', res)

效果如下,基本上可以和原来的c++版对应上 

 不过亲测这个算法只适合本来原图就是偏暗的图片,我这样的试了几张生活照基本上都失败的,所以这个算法适用范围很有限。

 

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

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

相关文章

java0615

01java语言背景介绍 02java语言跨平台原理 03JRE和JDK

View UI Plus (iview)表格单选实现教程

View UI Plus 是 View Design 设计体系中基于 Vue.js 3 的一套 UI 组件库,主要用于企业级中后台系统 View UI,即原先的 iView,从 2019 年 10 月起正式更名为 View UI,并使用全新的 Logo View UI Plus 实现表格单选,这…

八股文总结

文章目录 项目介绍1.不动产项目项目难点机器学习算法调研图像提取算法调研数据集-ImageNetXceptionVGGInceptionDensenetMobilenet 系统流程图 2.图书项目技术栈ShiroMybatisMyBatis:Mybatis Plus: 面试问题 Java基础基本数据类型反射接口和抽象类异常代理模式1. 静态代理2. 动…

Java Logback日志框架概述及logback.xml详解

日志技术具备的优势 可以将系统执行的信息选择性的记录到指定的位置(控制台、文件中、数据库中)。 可以随时以开关的形式控制是否记录日志,无需修改源代码。 日志体系结构 Logback日志框架 Logback是由log4j创始人设计的另一个开源日志组件&#xff0…

Android classLoader 双亲委托 反射

双亲委托 双亲委托机制,就是导入类的时候判断parent是否已经导入过该类。 作用 1、避免重复加载,当父加载器已经加载了该类的时候,没有必要子ClassLoader再加载一次。 2、安全性考虑,防止核心API库被随意篡改。 核心代码 pri…

CSS查缺补漏之常用长度单位(px、em、rem、%、vw/vh、vmin/vmax)

此文内容较少,轻轻松松掌握,莫要有压力~ 正如现实生活中长度具有mm、dm、cm、m等,在css中,也具备多种长度单位,本文对常用的几种单位进行详细举例介绍~ px:像素单位 初学css时,px单位经常被使用…

2023-06-16 Android Studio 使用CMakeList编译JNI ,源码

一、代码结构图,代码路径https://download.csdn.net/download/qq_37858386/87913001 二、cmakedemo\app\build.gradle 加下面的代码 externalNativeBuild {cmake {cppFlags "-frtti -fexceptions"}}externalNativeBuild {cmake {path src/main/jni/CMakeL…

邮件触发无需代码连接维格表的方法

1.邮件触发用户使用场景: 公司时常会收到来自各地的合作邮件,为了筛选合适的合作伙伴,公司需要查询对方企业的基础工商信息,例如企业的存续状态、法人代表、注册资金等等,然后将查询后的信息发送至高管群里&#xff0c…

使用docker部署ELK实战

目录 什么是ELKELK简介ElasticsearchLogstashKibana docker安装ELK安装es安装 Kibana安装logstash 什么是ELK ELK是一个开源的数据分析平台,由三个开源项目Elasticsearch、Logstash和Kibana组成,因此被称为ELK Stack。ELK Stack主要用于处理和分析大量的…

数字安全免疫力:“关基”企业构建安全体系的通关攻略

2023年5月1日起,《信息安全技术 关键信息基础设施安全保护要求》(以下简称《关基保护要求》)正式实施,这是关键信息基础设施安全保护相关的首个国家标准。相对于2021年9月1日起实施的《关键信息基础设施安全保护条例》&#xff0c…

复习css样式的第1章

什么是 CSS? CSS 指的是层叠样式表* (Cascading Style Sheets)CSS 描述了如何在屏幕、纸张或其他媒体上显示 HTML 元素CSS 节省了大量工作。它可以同时控制多张网页的布局外部样式表存储在 CSS 文件中 三种使用 CSS 的方法 有三种插入样式表的方法: 外…

RISC-V体系结构的U-Boot引导过程 第一阶段

RISC-V体系结构的U-Boot引导过程 第一阶段 flyfish .globl _start _start:.globl使符号对链接器可见相当于C语言中的Extern,声明此变量,并且告诉链接器此变量是全局变量,外部可以访问.u-boot.lds里的ENTRY(_start)也是这里的_start。 即指定…

SUNet: Swin Transformer UNet for ImageDenoising

Abstract 图像恢复是一个具有挑战性的不适定问题,也是一个长期存在的问题。在过去的几年中,卷积神经网络(cnn)几乎主导了计算机视觉,并在不同层次的视觉任务中取得了相当大的成功,包括图像恢复。然而,最近基于Swin tr…

权限验证框架之Shiro

文章目录 前言shiro 核心项目构建默认Session模式配置测试接口Realm编写权限测试无权限测试登录测试权限测试 前后端分离tokenJWTFilter重写认证修改配置 总结 前言 交替换个脑子,一直搞考研的东西,实在是无聊。所以顺便把工程上的东西,拿来…

软件测试面试大全(全800+题)

1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行,可以实现跨平台,客户端零维护,维护成本低,但是个性化能力低,响应速度较慢 C/S响应速度快,安全性强,一般应用于局域网中&#xff0c…

C++ [STL之list模拟实现]

本文已收录至《C语言和高级数据结构》专栏! 作者:ARMCSKGT STL之list模拟实现 前言正文基本框架节点类迭代器类list类 迭代器类功能实现list迭代器迭代器设计思想迭代器操作设计 list类功能实现默认成员函数容量查询数据访问节点插删相关头尾插删任意位置…

MySQL数据库索引的种类、创建、删除

目录 一:MySQL 索引 1、MySQL 索引介绍 2、 索引的作用 3、索引的副作用 4、 创建索引的原则依据 二、索引的分类和创建 1、 普通索引 (1) 直接创建索引 (2) 修改表方式创建 (3) 创建表的…

【Turfjs】几何计算,计算地理空间上点坐标的经纬度,距离,围成的闭合空间面积等工作,都可以通过Turfkjs来实现

​​​​​​Turf.js中文网 几何计算: 1. 前端js就用这个 Turfjs的类库。参考网站: 计算两线段相交点 | Turf.js中文网 2. 后端java语言就可以用 JTS这个类库,参考网站:https://locationtech.github.io/jts/ https://github.com…

MVCC和undo log

MVCC多版本并发控制 MVCC是多版本并发控制(Multi-Version Concurrency Control,简称MVCC),是MySQL中基于乐观锁理论实现隔离级别的方式,用于实现已提交读和可重复读隔离级别的实现,也经常称为多版本数据库…

面向对象接口

生活中大家每天都在用 USB 接口,那么 USB 接口与我们今天要学习的接口有什 么相同点呢? 在Java程序设计中的接口 接口就是规范,定义的是一组规则,体现了现实世界中“如果你是/要…则必须 能…”的思想。继承是一个"是不是&…