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

OpenCV计算摄影学(13)实现 Reinhard 全局色调映射算法的类cv::TonemapReinhard

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::TonemapReinhard 是 OpenCV 中用于实现 Reinhard 全局色调映射算法的类。这种算法主要用于将高动态范围(HDR)图像转换为低动态范围(LDR),以便能够在标准显示设备上正确显示。Reinhard 算法通过调整图像中的亮度和对比度,使得图像的细节更加丰富,并且能够保持自然的视觉效果。

主要函数和参数

  • 创建对象:
    你可以使用默认构造函数来创建一个 cv::TonemapReinhard 对象:cv::Ptrcv::TonemapReinhard tonemap = cv::createTonemapReinhard();

  • process() 函数:
    这是该类的核心函数,用于执行色调映射操作。它接受一个或多个 HDR 图像作为输入,并输出经过处理的 LDR 图像。
    使用方法:tonemap->process(hdri, ldr);

    • hdri 是输入的 HDR 图像。
    • ldr 是输出的 LDR 图像。
  • 设置参数:

    • setGamma(float gamma):设置伽马校正值,默认值为 1.0。
    • setIntensity(float intensity):控制整体亮度,默认值为 0(中性)。
    • setLightAdaptation(float light_adapt):控制全局亮度适应,默认值为 1(完全适应)。
    • setColorAdaptation(float color_adapt):控制颜色适应,默认值为 0(不进行颜色适应)。

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/photo.hpp>

int main()
{
    // 加载HDR图像
    cv::Mat hdr_image = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/hdr_image.hdr", cv::IMREAD_ANYDEPTH );
    if ( hdr_image.empty() )
    {
        std::cerr << "无法加载HDR图像!" << std::endl;
        return -1;
    }

    // 创建色调映射对象,并根据需要调整参数
    cv::Ptr< cv::TonemapReinhard > tonemap = cv::createTonemapReinhard( 1.5f, 0.0f, 1.0f, 0.0f );  // 设置参数: gamma, intensity, light_adapt, color_adapt

    // 执行色调映射
    cv::Mat ldr_image;
    tonemap->process( hdr_image, ldr_image );

    // 将LDR图像强度归一化到[0, 255]范围
    ldr_image *= 255;
    ldr_image.convertTo( ldr_image, CV_8U );

    // 正规化显示HDR图像
    double minVal, maxVal;
    cv::minMaxLoc( hdr_image, &minVal, &maxVal );  // 获取HDR图像的最大最小值
    cv::Mat normalized_hdr_image;
    hdr_image.convertTo( normalized_hdr_image, CV_8U, 255.0 / maxVal );  // 正规化到[0, 255]

    // 显示结果或保存图像
    cv::imshow( "Original HDR Image", normalized_hdr_image );
    cv::imshow( "Tone Mapped LDR Image", ldr_image );
    cv::imwrite( "reinhard_ldr_image.jpg", ldr_image );

    cv::waitKey( 0 );
    cv::destroyAllWindows();

    return 0;
}

运行结果

在这里插入图片描述

相关文章:

  • 基于Arcgis的python脚本实现相邻矢量面的高度字段取平均值
  • 力扣-动态规划-583 两个字符的删除操作
  • 从0到1构建AI深度学习视频分析系统--基于YOLO 目标检测的动作序列检查系统:(0)系统设计与工具链说明
  • QT 作业 day4
  • 浅谈开发环境
  • 视音频数据处理入门:颜色空间(二)---ffmpeg
  • 前端开发好用的AI工具介绍
  • AI 芯片全解析:定义、市场趋势与主流芯片对比
  • Stable Diffusion Prompt编写规范详解
  • 测试工程师的DeepSeek提效2:自动化测试应用
  • 科普篇之Java堆内缓存优化-IntegerCache的使用
  • 边缘计算概念、厂商介绍及产业分析
  • 软件架构设计7大原则
  • 面试八股文--数据库基础知识总结(3)MySQL优化
  • 使用Windbg分析dump文件定位软件异常的方法与操作步骤
  • pandas如何在指定位置添加一个dataframe
  • 力扣hot100刷题——栈
  • 【大模型系列篇】国产开源大模型DeepSeek-V3技术报告解析
  • quillEditor 禁用复制粘贴图片,以及class转style等问题
  • 【C++ 函数重载】—— 现代编译技术下的多态表达与性能优化
  • 中国企业500强厉害吗/公司百度官网优化
  • 微网站设计制作/搜索引擎营销案例有哪些
  • 深圳市福田区香蜜湖街道/搜索优化指的是什么
  • 土特产网站建设/宁波seo搜索优化费用
  • 佛山营销网站建设服务公司/sem竞价广告
  • 郑州艾特网站建设/市场营销专业课程