- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
cv::TonemapDrago 是 OpenCV 中实现的基于 Paul Debevec 和 Jorge Moraleda 以及后来由 Rogier van de Weijer 和 Theo Drago 改进的色调映射算法的一个具体类。该算法特别适用于高动态范围(HDR)图像到低动态范围(LDR)图像的转换,目的是让 HDR 图像能够在标准显示器上显示,同时尽可能地保留原始图像中的细节和色彩。
主要特点
-
全局与局部对比度:cv::TonemapDrago 算法通过平衡图像的全局和局部对比度来增强视觉效果。它能够自适应调整图像亮度,避免过度曝光或曝光不足的问题。
-
参数调节:
- Gamma (γ): 控制输出图像的伽马校正值,默认值为1.0。伽马校正影响中间亮度级别的表现。
- Saturation: 控制色彩饱和度,默认值为1.0。增加这个值会使颜色更加鲜艳,但过高可能导致不自然的颜色表现。
- Bias: 控制压缩曲线的偏置,用于调整亮区和暗区之间的权重。默认值通常设置为0.85,但是你可以根据需要进行调整以获得最佳效果。
方法介绍
-
createTonemapDrago(float gamma = 1.0f, float saturation = 1.0f): 创建一个 cv::TonemapDrago 对象,并允许用户指定初始的伽马值和饱和度值。
-
process(InputArray src, OutputArray dst): 这是核心方法,用于执行色调映射操作。src 参数应为32位浮点型、BGR格式的HDR图像,而 dst 则为经过色调映射后的LDR图像。
代码示例
#include <opencv2/opencv.hpp>
#include <opencv2/photo.hpp>using namespace cv;int main()
{// 加载HDR图像Mat hdr = imread( "path_to_hdr_image.hdr", IMREAD_ANYDEPTH );if ( hdr.empty() ){printf( "Could not open or find the HDR image.\n" );return -1;}// 创建TonemapDrago对象并设置参数Ptr< TonemapDrago > tonemapDrago = createTonemapDrago( 1.0, 1.0 );Mat ldr;// 执行色调映射tonemapDrago->process( hdr, ldr );// 将像素值归一化到[0, 1]范围内,然后转换到8位无符号整数ldr *= 255;ldr.convertTo( ldr, CV_8U );// 显示结果imshow( "Original HDR Image", hdr );imshow( "Tone-mapped LDR Image", ldr );waitKey( 0 );return 0;
}