OpenCV调整图像亮度和对比度
【欢迎关注编码小哥,学习更多实用的编程方法和技巧】
1、基本方法---线性变换
// 亮度和对比度调整
cv::Mat adjustBrightnessContrast(const cv::Mat& src, double alpha, int beta) {cv::Mat dst;src.convertTo(dst, -1, alpha, beta);return dst;
}// 使用示例
cv::Mat image = cv::imread("image.jpg");
cv::Mat brightened = adjustBrightnessContrast(image, 1.0, 50); // 增加亮度
cv::Mat darkened = adjustBrightnessContrast(image, 1.0, -50); // 降低亮度
cv::Mat increased_contrast = adjustBrightnessContrast(image, 1.5, 0); // 增加对比度
2、通道分离调整
cv::Mat adjustChannelBrightness(const cv::Mat& src) {// 分离BGR通道std::vector<cv::Mat> channels;cv::split(src, channels);// 调整蓝色通道亮度channels[0] = channels[0] * 1.2 + 30;// 重新合并通道cv::Mat result;cv::merge(channels, result);return result;
}
3、查找表方法
cv::Mat createBrightnessLUT(double contrast, int brightness) {cv::Mat lookupTable(1, 256, CV_8U);uchar* lut = lookupTable.ptr();for (int i = 0; i < 256; i++) {// 对比度和亮度调整公式lut[i] = cv::saturate_cast<uchar>(contrast * i + brightness);}return lookupTable;
}// 应用LUT
cv::Mat applyLUTAdjustment(const cv::Mat& src, double contrast, int brightness) {cv::Mat lookupTable = createBrightnessLUT(contrast, brightness);cv::Mat result;cv::LUT(src, lookupTable, result);return result;
}
4、高级对比度增强
cv::Mat enhanceContrast(const cv::Mat& src) {cv::Mat dst;// 直方图均衡化if (src.channels() == 1) {// 灰度图cv::equalizeHist(src, dst);} else {// 彩色图转换到YUV空间cv::Mat yuv;cv::cvtColor(src, yuv, cv::COLOR_BGR2YUV);// 仅均衡化亮度通道std::vector<cv::Mat> channels;cv::split(yuv, channels);cv::equalizeHist(channels[0], channels[0]);// 合并通道cv::merge(channels, yuv);cv::cvtColor(yuv, dst, cv::COLOR_YUV2BGR);}return dst;
}
5、伽马校正
cv::Mat gammaCorrection(const cv::Mat& src, double gamma = 1.0) {cv::Mat dst;// 归一化cv::Mat normalized;src.convertTo(normalized, CV_32F, 1.0/255);// 伽马变换cv::pow(normalized, gamma, dst);// 还原到0-255dst = dst * 255;dst.convertTo(dst, CV_8U);return dst;
}// 使用示例
cv::Mat gammaEnhanced1 = gammaCorrection(image, 0.5); // 变亮
cv::Mat gammaEnhanced2 = gammaCorrection(image, 2.0); // 变暗
6、自适应对比度增强
cv::Mat adaptiveContrastEnhancement(const cv::Mat& src) {cv::Mat lab;cv::cvtColor(src, lab, cv::COLOR_BGR2Lab);// 分离通道std::vector<cv::Mat> channels;cv::split(lab, channels);// 限制对比度自适应直方图均衡化(CLAHE)cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE(2.0, cv::Size(8, 8));clahe->apply(channels[0], channels[0]);// 合并通道cv::merge(channels, lab);cv::Mat result;cv::cvtColor(lab, result, cv::COLOR_Lab2BGR);return result;
}
7、通用图像增强类
class ImageEnhancer {
private:cv::Mat image;public:ImageEnhancer(const cv::Mat& src) : image(src.clone()) {}// 线性变换cv::Mat linearTransform(double contrast = 1.0, int brightness = 0) {cv::Mat dst;image.convertTo(dst, -1, contrast, brightness);return dst;}// 伽马校正cv::Mat gammaCorrection(double gamma = 1.0) {cv::Mat normalized, corrected;image.convertTo(normalized, CV_32F, 1.0/255);cv::pow(normalized, gamma, corrected);corrected = corrected * 255;cv::Mat result;corrected.convertTo(result, CV_8U);return result;}// 自适应对比度增强cv::Mat adaptiveCLAHE() {cv::Mat lab;cv::cvtColor(image, lab, cv::COLOR_BGR2Lab);std::vector<cv::Mat> channels;cv::split(lab, channels);cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE(2.0, cv::Size(8, 8));clahe->apply(channels[0], channels[0]);cv::merge(channels, lab);cv::Mat result;cv::cvtColor(lab, result, cv::COLOR_Lab2BGR);return result;}
};// 使用示例
cv::Mat image = cv::imread("image.jpg");
ImageEnhancer enhancer(image);cv::Mat brightened = enhancer.linearTransform(1.0, 50);
cv::Mat gammaEnhanced = enhancer.gammaCorrection(0.5);
cv::Mat adaptiveEnhanced = enhancer.adaptiveCLAHE();
8、完整示例
int main() {// 读取图像cv::Mat image = cv::imread("image.jpg");// 创建增强器ImageEnhancer enhancer(image);// 多种增强方法cv::Mat result1 = enhancer.linearTransform(1.2, 30); // 增加亮度和对比度cv::Mat result2 = enhancer.gammaCorrection(0.8); // 伽马校正cv::Mat result3 = enhancer.adaptiveCLAHE(); // 自适应对比度增强// 显示结果cv::imshow("Original", image);cv::imshow("Brightened and Enhanced", result1);cv::imshow("Gamma Corrected", result2);cv::imshow("Adaptive CLAHE", result3);cv::waitKey(0);return 0;
}
注意事项
- 使用
cv::saturate_cast
防止溢出 - 注意数据类型转换
- 考虑图像通道数
- 处理边界情况
- 性能优化
性能建议
- 使用
cv::Mat
操作替代逐像素遍历 - 利用OpenCV的矩阵运算
- 对于大图像,考虑并行处理
- 使用
cv::cuda
进行GPU加速
相关文章:
OpenCV调整图像亮度和对比度
【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 1、基本方法---线性变换 // 亮度和对比度调整 cv::Mat adjustBrightnessContrast(const cv::Mat& src, double alpha, int beta) {cv::Mat dst;src.convertTo(dst, -1, alpha, beta);return dst; }// 使用…...

Kafka Offset explorer使用
Kafka集群配置好以后以后运维这边先用工具测试一下,便于rd展开后续的工作,本地调试时一般使用Offset explorer工具进行连接 使用SASL(Simple Authentication and Security Layer)验证方式 使用SCRAM-SHA-256(Salted Challenge Response Authentication…...

二维码文件在线管理系统-收费版
需求背景 如果大家想要在网上管理自己的文件,而且需要生成二维码,下面推荐【草料二维码】,这个系统很好。特别适合那些制造业,实体业的使用手册,你可以生成一个二维码,贴在设备上,然后这个二维码…...
UE4.27 Android环境下获取手机电量
获取电量方法 使用的方法时FAndroidMisc::GetBatteryLevel(); 出现的问题 但是在电脑上编译时发现,会发现编译无法通过。 因为安卓环境下编译时,包含 #include "Android/AndroidPlatformMisc.h" 头文件是可以正常链接的,但在电…...
vue-i18n报错
1. 开发环境报错Uncaught (in promise) TypeError: ‘set’ on proxy: trap returned falsish for property ‘$t’ legacy需要设置为false const i18n createI18n({legacy: false,// 默认语言locale: lang,// 设置语言环境messages, })2. 打包配置tsc --noEmit时报错&#…...

Docker新手:在tencent云上实现Python服务打包到容器
1 使用docker的原因 一致性和可移植性:Docker 容器可以在任何支持 Docker 的环境中运行,无论是开发者的笔记本电脑、测试服务器还是生产环境。这确保了应用在不同环境中的行为一致,减少了“在我的机器上可以运行”的问题。 隔离性ÿ…...
React基础知识学习
学习React前端框架是一个系统而深入的过程,以下是一份详细的学习指南: 一、React基础知识 React简介 React是一个用于构建用户界面的JavaScript库,由Facebook开发和维护。它强调组件化和声明式编程,使得构建复杂的用户界面变得更…...

ES IK分词器插件
前言 ES中默认了许多分词器,但是对中文的支持并不友好,IK分词器是一个专门为中文文本设计的分词工具,它不是ES的内置组件,而是一个需要单独安装和配置的插件。 Ik分词器的下载安装(Winows 版本) 下载地址:…...
二十三种设计模式-抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式,用于创建一系列相关或相互依赖的对象,而不需要指定它们具体的类。这种模式主要用于系统需要独立于其产品的创建逻辑时,并且…...

python opencv的orb特征检测(Oriented FAST and Rotated BRIEF)
官方文档:https://docs.opencv.org/4.10.0/d1/d89/tutorial_py_orb.html SIFT/SURF/ORB对比 https://www.bilibili.com/video/BV1Yw411S7hH?spm_id_from333.788.player.switch&vd_source26bb43d70f463acac2b0cce092be2eaa&p80 ORB代码 import numpy a…...

高阶数据结构----布隆过滤器和位图
(一)位图 位图是用来存放某种状态的,因为一个bit上只能存0和1所以一般只有两种状态的情况下适合用位图,所以非常适合判断数据在或者不在,而且位图十分节省空间,很适合于海量数据,且容易存储&…...

VScode使用密钥进行ssh连接服务器方法
如何正常连接ssh的方式可以看我原来那篇文章:Windows上使用VSCode连接远程服务器ssh 1.连接 点击ssh加号,然后关键点在第2步的书写上 2.命令 2的位置写命令: ssh -i "C:\Users\userName\.ssh\id_rsa" usernameIP -p 端口号 端…...

艾体宝产品丨加速开发:Redis 首款 VS Code 扩展上线!
Redis 宣布推出其首款专为 VS Code 设计的 Redis 扩展。这一扩展将 Redis 功能直接整合进您的集成开发环境(IDE),旨在简化您的工作流程,提升工作效率。 我们一直致力于构建强大的开发者生态系统,并在您工作的每一步提…...

应用架构模式
设计模式 设计模式是指根据通用需求来设计解决方案的模板或蓝图,使用设计模式能够更加有效地解决设计过程中的常见问题。设计模式针对不同的问题域有不同的内涵,主要涉及业务、架构、程序设计等问题域,本文主要讨论架构设计模式。 业务设计模…...
注入少量可学习的向量参数: 注入适配器IA3
注入少量可学习的向量参数: 注入适配器IA3 简介:IA3通过学习向量来对激活层加权进行缩放,从而获得更强的性能,同时仅引入相对少量的新参数。它的诞生背景是为了改进LoRA,与LoRA不同的是,IA3直接处理学习向量,而不是学习低秩权重矩阵,这使得可训练参数的数量更少,并且原…...

【C++】B2076 球弹跳高度的计算
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式输出格式输入输出示例 💯两种代码实现及其对比我的代码实现代码分析优点与不足 老师的代码实现代码分析优点与不足 💯两种实现的对…...
【Python】selenium结合js模拟鼠标点击、拦截弹窗、鼠标悬停方法汇总(使用 execute_script 执行点击的方法)
我们在写selenium获取网络信息的时候,有时候我们会受到对方浏览器的监控,对方通过分析用户行为模式,如点击、滚动、停留时间等,网站可以识别出异常行为,进而对Selenium爬虫进行限制。 这里我们可以加入JavaScript的使…...
CatBoost算法详解与PyTorch实现
CatBoost算法详解与PyTorch实现 目录 CatBoost算法详解与PyTorch实现@[TOC](目录)1. CatBoost算法概述1.1 梯度提升树(GBDT)1.2 CatBoost的优势2. CatBoost的核心技术2.1 类别特征处理2.2 对称树结构2.3 有序提升技术2.4 正则化技术3. PyTorch实现CatBoost3.1 环境准备3.2 Py…...

“TypeScript版:数据结构与算法-初识算法“
引言 在算法与编程的广阔世界里,总有一些作品以其独特的魅力和卓越的设计脱颖而出,成为我们学习和研究的典范。今天,我非常荣幸地向大家分享一个令人印象深刻的算法——Hello算法。 Hello算法不仅展现了作者深厚的编程功底,更以…...
mysql中递归的使用 WITH RECURSIVE
MySQL递归查询的基本语法和用法 MySQL 8.0及以上版本支持使用WITH RECURSIVE来进行递归查询。WITH RECURSIVE定义了一个递归的公用表表达式(CTE),它包含两个部分:递归的基础部分(非递归部分)和递归部分。 …...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...