OpenCV计算摄影学(13)实现Reinhard全局色调映射算法的类cv::TonemapReinhard
- 人工智能
- 2025-09-10 19:48:02

操作系统: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; } 运行结果OpenCV计算摄影学(13)实现Reinhard全局色调映射算法的类cv::TonemapReinhard由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“OpenCV计算摄影学(13)实现Reinhard全局色调映射算法的类cv::TonemapReinhard”