[C++][opencv]基于opencv实现photoshop算法亮度和对比度调整

news2024/9/24 11:33:47

【测试环境】

vs2019

opencv==4.8.0

【效果演示】

【核心实现代码】

#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;


#define SWAP(a, b, t)  do { t = a; a = b; b = t; } while(0)
#define CLIP_RANGE(value, min, max)  ( (value) > (max) ? (max) : (((value) < (min)) ? (min) : (value)) )
#define COLOR_RANGE(value)  CLIP_RANGE(value, 0, 255)
#define M_PI 3.14
/**
 * Adjust Brightness and Contrast
 *
 * @param src [in] InputArray
 * @param dst [out] OutputArray
 * @param brightness [in] integer, value range [-255, 255]
 * @param contrast [in] integer, value range [-255, 255]
 *
 * @return 0 if success, else return error code
 */
int adjustBrightnessContrast(InputArray src, OutputArray dst, int brightness, int contrast)
{
	Mat input = src.getMat();
	if (input.empty()) {
		return -1;
	}

	dst.create(src.size(), src.type());
	Mat output = dst.getMat();

	brightness = CLIP_RANGE(brightness, -255, 255);
	contrast = CLIP_RANGE(contrast, -255, 255);

	/**
	Algorithm of Brightness Contrast transformation
	The formula is:
		y = [x - 127.5 * (1 - B)] * k + 127.5 * (1 + B);
		x is the input pixel value
		y is the output pixel value
		B is brightness, value range is [-1,1]
		k is used to adjust contrast
			k = tan( (45 + 44 * c) / 180 * PI );
			c is contrast, value range is [-1,1]
	*/

	double B = brightness / 255.;
	double c = contrast / 255.;
	double k = tan((45 + 44 * c) / 180 * M_PI);

	Mat lookupTable(1, 256, CV_8U);
	uchar* p = lookupTable.data;
	for (int i = 0; i < 256; i++)
		p[i] = COLOR_RANGE((i - 127.5 * (1 - B)) * k + 127.5 * (1 + B));

	LUT(input, lookupTable, output);

	return 0;
}



static string window_name = "photo";
static Mat src;
static int brightness = 255;
static int contrast = 255;

static void callbackAdjust(int, void*)
{
	Mat dst;
	adjustBrightnessContrast(src, dst, brightness - 255, contrast - 255);
	imshow(window_name, dst);
}


 【完整演示源码下载地址】

https://download.csdn.net/download/FL1623863129/89633007

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

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

相关文章

【区块链+食品安全】食药产业全流程可追溯平台 | FISCO BCOS应用案例

为响应国家强化食品安全追溯监管的号召&#xff0c;吉科软信息技术有限公司基于 FISCO BCOS 联盟链开源技术&#xff0c;推出了 食药产业全流程可追溯平台&#xff0c;并应用于吉林省白山市。该平台建立了从食药产品种养殖、生产加工、冷链运输、 流通到消费的全链条可追溯体系…

掌握Python eval()函数:解析动态代码执行的神奇之处

eval() 是 Python 提供的一个内置函数&#xff0c;用于动态执行字符串形式的表达式。 虽然它功能强大&#xff0c;但同时也伴随着一定的风险和局限性。在本文中&#xff0c;我们将详细介绍 eval() 的用法、注意事项以及一些常见的应用场景。 一、eval() 函数的基本用法 基本语…

SpringIOC和SpringAOC

lombok插件 XML<!-- 加载资源文件 --><context:property-placeholder location"classpath:jdbc.properties"></context:property-placeholder><!-- 注入数据源 --><bean id"dataSource" class"com.mchange.v2.c3p0.ComboP…

Supervision 计算机视觉工具

简介 Supervision库是Python计算机视觉低代码工具&#xff0c;旨在为用户提供便捷高效的接口&#xff0c;以便处理数据集并直观地展示检测结果。绘制检测结果&#xff0c;统计指定区域内检测目标数量Supervision都提供了相应的接口 安装库 要求Python版本>3.8 1.安装无图像…

【机器学习】反向传播算法的直观解释、微积分原理以及反向传播中的链式法则

引言 正如有句话说的好&#xff0c;neurons-that-fire-together-wire-together&#xff08;一同激活的神经元关联在一起&#xff09; 文章目录 引言一、反向传播算法的直观解释1.1 前向传播1.2 计算误差1.3 反向传播误差1.4 更新权重 二、微积分原理2.1 损失函数 L L L2.2 链式…

javaEE WebServlet、SpringWebMVC、SpringBoot实现跨域访问的4种方式及优先级

文章目录 1. 前置知识2. 原理和解决方案总结2.1. 跨域不通过原理流程图2.2. 实现原理&#xff1a;添加以下http响应头2.3. 四种跨域实现方式及优先级&#xff08;从高到低&#xff09; 3. 具体实现代码3.1. 跨域全局配置方式-Filter(全适用)3.2. 跨域全局配置方式-SpringMvc3.3…

数字孪生模型制作教程虚拟现实城市模型制作3dmax数字城市glb/gltf

需要做数字孪生可以QQ可以联系这里&#xff0c;谢谢 下面开始教程 1打开3dmax软件&#xff0c;和需要做的建筑图片 2 在3dmax安图片先建一个长方体框架 3先给长方体贴一个墙体贴图 4在ps做贴图 5 做好贴图贴到3dmax中 6 然后ps再做下一张贴图 7 做好贴图贴到3dma…

[Redis] Redisson分布式锁原理及源码分析

目录 基于 Redis 的分布式锁 Redisson实现分布 Redisson分布式锁原理图 RedissonLock实现分布式锁源码分析 RedissonLock构造方法 lock()加锁 获取锁 锁续命逻辑 tryLockInnerAsync加锁lua脚本分析 unlock()解锁 基于 Redis 的分布式锁 实现方式: 使用 Redis 的 SE…

Idea2023.3版本创建spring Initializr没有JDK8

解决方法&#xff1a; https://start.aliyun.com

SOMEIP_ETS_037:echoUINT8RELIABLE_client_closes_TCP_connection_automatically

测试目的&#xff1a; 验证当所有服务停止时&#xff0c;DUT不会关闭TCP连接。 描述 本测试用例旨在检验DUT在停止所有服务时&#xff0c;是否能够保持TCP连接的活跃状态&#xff0c;而不发送FIN,ACK以关闭连接。 测试拓扑&#xff1a; 具体步骤&#xff1a; TESTER&#…

STM32学习笔记3 ---中断,定时器

目录 EXTI外部中断 NVIC嵌套中断向量控制器 EXTI外部中断 AFIO 旋转编码器 定时器TIM TIM定时中断 ​编辑​编辑 ​编辑 TIM输出比较&#xff08;OC&#xff09; 引脚重映射 舵机 直流电机 TIM输入捕获&#xff08;IC&#xff09; ​编辑 TIM编码器接口 附&#…

漏洞挖掘 | 某系统webpack接口泄露引发的一系列漏洞

信息搜集 这里找到从小穿一条裤子长大的兄弟&#xff0c;要挟他交出来他的统一账号&#xff0c;否则把小时候的照片挂网上&#xff0c;开始某大学的资产搜集&#xff0c;直接hunter搜索此大学域名 看有价值的站点&#xff0c;ok找到下面的站点 未授权敏感信息泄露越权任意用…

力扣高频SQL 50题(基础版)第四十二题之1517.查找拥有有效邮箱的用户

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十二题1517.查找拥有有效邮箱的用户题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第四十二题 1517.查找拥有有效邮箱的用户 题目说明 表: Users -----------…

Dify on WeChat

Dify on WeChat 本项目为 chatgpt-on-wechat下游分支 额外对接了LLMOps平台 Dify&#xff0c;支持Dify智能助手模型&#xff0c;调用工具和知识库&#xff0c;支持Dify工作流。 Dify接入微信生态的详细教程请查看文章 手摸手教你把 Dify 接入微信生态 如果我的项目对您有帮助…

gin获得get和post请求参数,获得请求头信息

获得头信息 router.GET("/", func(c *gin.Context) {name : c.Query("id")fmt.Println(name)Token : c.GetHeader("Token")c.JSON(http.StatusOK, Token)})获得get和post信息 package mainimport ("fmt""github.com/SimonWang00…

Leetcode面试经典150题-236.二叉树的最低公共祖先

解法都在代码里&#xff0c;不懂就留言或者私信 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution {/**题目分析&#xff1a;本题是经典的二…

仓颉语言运行时轻量化实践

杨勇勇 华为语言虚拟机实验室架构师&#xff0c;目前负责仓颉语言静态后端的开发工作 仓颉语言运行时轻量化实践 仓颉Native后端&#xff08;CJNative&#xff09;是仓颉语言的高性能、轻量化实现。这里的“轻量化”意指仓颉程序运行过程中占用系统资源&#xff08;内存、CPU等…

数据分析:品牌营销如何借势小红书搜索流量

导语 近期&#xff0c;小红书推出《10大搜索趋势洞察》&#xff0c;在找答案这件事上&#xff0c;你永远可以相信小红书。 据悉&#xff0c;70%的小红狐月活用户使用搜索功能&#xff0c;用户平均每天搜索6次&#xff0c;三分之一的用户打开小红书的第一件事就是搜索&#xf…

haproxy知识点整理

haproxy知识点整理 haproxy七层代理负载均衡什么是负载均衡为什么使用负载均衡 负载均衡类型四层负载均衡七层负载均衡四层和七层的区别 环境搭建:客户端(client)haproxy服务器两台服务器hapserver1hapserver2 简单的haproxy负载均衡 haproxy的基本配置信息global配置proxies配…

2024高端网站设计公司推荐TOP3

随着互联网的飞速发展&#xff0c;现在的企业官网已经成为企业不可或缺的一部分&#xff0c;因为企业官网它不仅是企业品牌形象的延伸&#xff0c;也是连接客户、提升市场竞争力的重要工具。 以下简单阐述一下为何现代企业应当投资于高质量网站建设&#xff0c;搭建企业官网有…