- 操作系统: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;
}