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;
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村北头的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值