使用OpenCV创建色调图
- 色调映射和高动态范围成像
- 应用色调映射
- 相关链接
色调映射和高动态范围成像
高动态范围 (High Dynamic Range
, HDR
) 技术用于摄影成像,以再现比标准数字成像或摄影技术更大的动态范围的亮度。标准成像技术仅允许在一定范围内区分亮度,在范围之外,由于在明亮的区域没有差别,因此没有可见的特征,因为所有的东西都是纯白色的,而在黑暗的区域同样没有差别,因为所有东西都是纯黑的。图像中色调值(可测量光强度)的最大值和最小值之间的比率被称为动态范围。
由于打印和显示对比度的局限性,必须压缩输入 HDR
图像的扩展亮度范围才能使其可见,将 HDR
图像渲染到标准监视器或打印设备的方法称为色调映射。色调映射将图像的强度改变到高水平或高动态范围,降低 HDR
图像的整体对比度以便于在具有较低动态范围的设备或打印输出上显示,并且可以应用于生成具有保留的局部对比度的图像。
应用色调映射
在本节中,我们将学习如何使用 OpenCV
函数在 HDR
图像上应用色调映射。HDR
图像中像素的理论最大值可以是任意的。我们假设 HDR
图像是通过合并多个曝光图像创建的。
OpenCV
提供了四种色调映射算法实现:
- Drago
- Durand
- Reinhard
- Mantiuk
本节中,我们将介绍 Drago
和 Durand
色调映射算法,色调音调映射算法的常见参数如下:
- 参数
gamma
通过应用伽马校正来压缩动态范围:- γ = 1 γ= 1 γ=1:不进行校正
- γ < 1 γ<1 γ<1:使图像变暗
- γ > 1 γ> 1 γ>1:使图像变亮
- 参数
saturation
用于增加或减少饱和量;当饱和度高时,颜色会丰富而强烈;饱和值接近零,使颜色淡如灰度图像 - 参数
contrast
用于控制对比度
我们首先下载 HDR 图像 ( .hdr
文件),我们使用 HDR
图像作为输入,并使用色调映射算法显示该图像。
(1) 导入所需的库,并从磁盘中读取 HDR
图像:
import cv2
import numpy as np
#from skimage import img_as_ubyte
import matplotlib.pylab as plthdr_image = cv2.imread("snowman.hdr", -1)
(2) 使用 Drago
的 ToneMap
方法获取 BGR
彩色图像,将其转换为 RGB
图像。由于获得的图像的亮度较低,因此可以通过将其乘以一个正常数增加亮度:
tonemap_drago = cv2.createTonemapDrago(1.0, 0.7)
ldr_drago = tonemap_drago.process(hdr_image)
ldr_drago = 3 * ldr_drago
ldr_drago = cv2.cvtColor(ldr_drago, cv2.COLOR_BGR2RGB)
(3) 使用 Durand
的 ToneMap
方法获取 BGR
彩色图像,将其转换为 RGB
图像:
# tonemap_durand = cv2.createTonemapReinhard(1.5,4,1.0,1,1)
# ldr_durand = tonemap_durand.process(hdr_image)
# ldr_durand = 3 * ldr_durand
# ldr_durand = cv2.cvtColor(ldr_durand, cv2.COLOR_BGR2RGB)
(4) 最后,使用色调映射绘制从 HDR
图像获得的输出图像:
plt.figure(figsize=(20,20))
plt.subplot(111), plt.imshow(ldr_drago), plt.axis('off'), plt.title('Tone mapping with Drago\'s method', size=10)
# plt.subplot(212), plt.imshow(ldr_durand), plt.axis('off'), plt.title('Tone mapping with Durand\'s method', size=10)
plt.tight_layout()
plt.show()
相关链接
Python图像处理【1】图像与视频处理基础
Python图像处理【2】探索Python图像处理库
Python图像处理【3】Python图像处理库应用
Python图像处理【4】图像线性变换
Python图像处理【5】图像扭曲/逆扭曲
Python图像处理【6】通过哈希查找重复和类似的图像
Python图像处理【7】采样、卷积与离散傅里叶变换
Python图像处理【8】使用低通滤波器模糊图像
Python图像处理【9】使用高通滤波器执行边缘检测
Python图像处理【10】基于离散余弦变换的图像压缩
Python图像处理【11】利用反卷积执行图像去模糊
Python图像处理【12】基于小波变换执行图像去噪
Python图像处理【13】使用PIL执行图像降噪
Python图像处理【14】基于非线性滤波器的图像去噪
Python图像处理【15】基于非锐化掩码锐化图像
Python图像处理【16】OpenCV直方图均衡化
Python图像处理【17】指纹增强和细节提取
Python图像处理【18】边缘检测详解
Python图像处理【19】基于霍夫变换的目标检测