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

OpenCV计算摄影学(12)色调映射(Tone Mapping)的一个类cv::TonemapMantiuk

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

算法描述

cv::TonemapMantiuk 是 OpenCV 库中用于实现色调映射(Tone Mapping)的一个类,它基于 Mantiuk 等人提出的算法。色调映射是将高动态范围(HDR)图像转换为低动态范围(LDR)图像的过程,使得结果可以在常规显示器上显示。Mantiuk 的方法是一种流行的全局色调映射算子,旨在保留原始场景中的对比度和颜色信息,同时适应显示器的亮度范围。

主要特点

  • 全局操作:该算法不考虑图像的局部特性,而是对整个图像应用相同的变换。
  • 参数调整:用户可以通过调整几个关键参数来控制输出图像的视觉效果,包括伽马校正、饱和度增强和对比度比例因子等。

主要成员函数

  • process():这是主要的功能函数,接收一个或多个 HDR 图像,并返回经过色调映射处理后的 LDR 图像。此函数通常需要与 cv::MergeDebevec 或其他 HDR 合并技术结合使用。

  • getGamma() / setGamma(float gamma):获取/设置伽马值,用于调整图像的亮度分布。

  • getScale() / setScale(float scale):获取/设置对比度缩放因子,影响最终图像的对比度水平。

  • getSaturation() / setSaturation(float saturation):获取/设置饱和度增强因子,用于控制色彩的鲜艳程度。

代码示例

#include <opencv2/opencv.hpp>
#include <opencv2/photo.hpp>
using namespace cv;

int main()
{
    // 假设已经有一个HDR图像"hdr_image"
    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::TonemapMantiuk > tonemap = cv::createTonemapMantiuk( 1.5f, 4.0f, 3.0f );  // gamma, scale, saturation

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

    // 将LDR图像强度归一化到[0, 255]范围
    double minVal, maxVal;
    cv::minMaxLoc( ldr_image, &minVal, &maxVal );                    // 获取色调映射后图像的最大最小值
    ldr_image = 255 * ( ldr_image - minVal ) / ( maxVal - minVal );  // 归一化到[0, 255]
    ldr_image.convertTo( ldr_image, CV_8U );

    // 显示结果或保存图像
    cv::Mat normalized_hdr_image;
    cv::minMaxLoc( hdr_image, &minVal, &maxVal );                        // 获取HDR图像的最大最小值
    hdr_image.convertTo( normalized_hdr_image, CV_8U, 255.0 / maxVal );  // 正规化显示HDR图像

    cv::imshow( "Original HDR Image", normalized_hdr_image );
    cv::imshow( "Tone Mapped LDR Image", ldr_image );
    cv::imwrite( "enhanced_ldr_image.jpg", ldr_image );

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

    return 0;
}

运行结果

在这里插入图片描述

相关文章:

  • 模型推理增强微调
  • C++核心指导原则: 标准库
  • UE5设置打开新窗口默认停靠在主窗口
  • 【分享】网间数据摆渡系统,如何打破传输瓶颈,实现安全流转?
  • Redis的主要数据类型及其应用场景
  • 制服小程序的“滑手”:禁用页面左右滑动全攻略
  • mybatis热点面试题第五弹
  • Cherno C++ P60 为什么不用using namespace std
  • Golang的图形用户界面设计
  • 网络编程——TCP
  • 微信小程序接入DeepSeek模型(火山方舟),并在视图中流式输出
  • 03 HarmonyOS Next仪表盘案例详解(二):进阶篇
  • 浏览器多实例项目的隔离方案
  • (十 七)趣学设计模式 之 状态模式!
  • 【前端】JavaScript 备忘清单(超级详细!)
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_read_token - 详解(3)
  • 云原生周刊:基于 KubeSphere LuBan 架构打造DeepSeek 插件
  • CSDN博客写作教学(五):从写作到个人IP的体系化构建(完结篇)
  • 【AD】4-8 AD集成库的创建与安装
  • C# 多线程
  • 青年与城市共成长,第六届上海创新创业青年50人论坛将举办
  • 马上评|比起奇葩论文,更可怕的是“水刊”灰产
  • 长三角9座“万亿城市”一季报出炉:多地机器人产量大增
  • “五一”假期预计全社会跨区域人员流动累计14.67亿人次
  • 争抢入境消费红利,哪些城市有潜力?
  • 云南禄丰尾矿坍塌事故搜救正在进行,被掩埋的四辆工程车已找到