当前位置: 首页 > news >正文

【C++】OpenCV常用对比度增强方法

在 OpenCV 中,常用的 C++ 对比度增强方法有以下几种,附示例代码:


1. 线性变换(αβ 调整)

最常用的方法,通过线性变换增强对比度:

#include <opencv2/opencv.hpp>
using namespace cv;int main() {Mat src = imread("input.jpg");Mat dst;double alpha = 1.5; // 对比度增益(>1 增强对比度)int beta = 10;      // 亮度偏移src.convertTo(dst, -1, alpha, beta);imwrite("output_linear.jpg", dst);return 0;
}

公式:g(i,j) = α * f(i,j) + β,其中 α 控制对比度,β 控制亮度。


2. 直方图均衡化(全局增强)

适用于灰度图像:

#include <opencv2/opencv.hpp>
using namespace cv;int main() {Mat src = imread("input.jpg", IMREAD_GRAYSCALE);Mat dst;equalizeHist(src, dst);imwrite("output_hist.jpg", dst);return 0;
}

彩色图像需分通道处理:

Mat channels[3];
split(src, channels);
for (int i = 0; i < 3; i++) {equalizeHist(channels[i], channels[i]);
}
merge(channels, 3, dst);
imwrite("output_hist_color.jpg", dst);

3. 对比度拉伸(归一化到 0-255)

通过 normalize 实现:

#include <opencv2/opencv.hpp>
using namespace cv;int main() {Mat src = imread("input.jpg");Mat dst;normalize(src, dst, 0, 255, NORM_MINMAX);imwrite("output_normalize.jpg", dst);return 0;
}

4. CLAHE(自适应直方图均衡化)

针对局部对比度增强:

#include <opencv2/opencv.hpp>
using namespace cv;int main() {Mat src = imread("input.jpg", IMREAD_GRAYSCALE);Ptr<CLAHE> clahe = createCLAHE(2.0, Size(8, 8));Mat dst;clahe->apply(src, dst);imwrite("output_clahe.jpg", dst);return 0;
}

5. Gamma 校正(非线性增强)

适合低对比度、偏亮图像:

#include <opencv2/opencv.hpp>
#include <cmath>
using namespace cv;int main() {Mat src = imread("input.jpg");Mat dst;double gamma = 2.2;Mat table(1, 256, CV_8U);for (int i = 0; i < 256; i++)table.at<uchar>(i) = saturate_cast<uchar>(pow(i / 255.0, gamma) * 255.0);LUT(src, table, dst);imwrite("output_gamma.jpg", dst);return 0;
}

总结对比

方法适用场景特点
αβ 调整通用简单、快速
直方图均衡化低对比度全局增强,可能过曝
CLAHE局部对比度增强避免过曝,细节清晰
Gamma 校正亮度非线性调整适合偏亮/偏暗图像
归一化动态范围拉伸简单,适合低动态范围图像

根据图像特性和需求选择合适方法即可。

http://www.dtcms.com/a/294143.html

相关文章:

  • 华普微Matter模块HM-MT7201,打破智能家居生态孤岛
  • Shell 脚本里的流程控制
  • Android用户鉴权实现方案深度分析
  • Android Camera openCamera
  • 绿化工程路牙边界区分-CAD快速看图标注分类高效处理
  • 使用 MobaXterm 登录你的阿里云 ECS 实例
  • 不止于“亮”:一盏智慧路灯的技术进化史——塔能科技用“落地性”定义行业标准
  • RCLAMP0502A.TCT Semtech:超低电容TVS二极管,高速接口+军工级防护!
  • github最近的设计。
  • GraphQL批量查询优化:DataLoader如何让数据库访问速度飞起来?
  • Spring核心机制:@Bean注解与依赖注入的终极实践指南
  • ubuntu24的一些小问题
  • 分布式限流算法与组件
  • latex中既控制列内容位置又控制列宽,使用>{\centering\arraybackslash}p{0.85cm}
  • 修改 Lucide-React 图标样式的方法
  • rust嵌入式开发零基础入门教程(四)
  • webrtc整体架构
  • 重塑优化建模与算法设计:2025年大模型(LLM)在优化领域的应用盘点 - 2
  • Java中IO多路复用技术详解
  • Three.js 材质全解析:从 MeshBasicMaterial 到 MeshStandardMaterial
  • 通缩浪潮中的 “测量防线”:新启航如何用国产 3D 白光干涉仪筑牢半导体成本护城河?
  • 7月23日华为机考真题第二题-200分
  • 从机械操作到智能流程:火语言 RPA 在多场景中的效率提升实践
  • 如何提升AI收录?如何免费增加AI搜索推荐你的网站?有哪些免费好用的检测工具推荐?
  • Kafka使用场景与设计原理
  • 【金融机器学习】第五章:最优投资组合——Bryan Kelly, 修大成(中文翻译)
  • 量化金融简介(附电子书资料)
  • 大规模金融数据相关性并行计算系统设计与实现
  • MySQL金融级数据一致性保障:从原理到实战
  • Web开发基础与RESTful API设计实践指南