你真的懂HDR吗?(第一节,HDR初探)

已经记不清这是在那些网站中收集的各种资料了。有中文的,有英文的,有自己理解的。如有侵权,请告知。

当我们在网上搜索各种与HDR相关的帖子和文章时,经常看到很多关于它的误解。许多同学并不真正知道什么是HDR图像,什么是色调映射。有时甚至不确定是否知道为什么要使用HDR?

大家都知道,HDR代表高动态范围。什么是动态范围呢?它是场景中最低亮度和最高亮度之间的比率。

我们的眼睛的动态范围约为10000:1,也就是说眼睛能够在这样的亮度范围内捕捉细节。然而,真实场景的动态范围可能是10倍或100倍(例如100000:1).

更糟糕的是数码相机的动态范围比我们的眼睛还要低。目前市面上常见的摄像头的动态范围为10EVs左右。例如,佳能5d的动态范围约为11EVs。那11EVs到底是什么意思?2EV 比1EV亮2倍,4EV比2EV亮2倍,4EV比1EV亮4倍……以此类推,我们可以将EV转换为2的幂次方,并将比率写为:

2 ^ EV_Value : 1, 即,2^11=2048:1, 只有2.000:1!

这是一个非常强大的相机,但是跟我们的眼睛比起来,差5倍!

然而,现实却变得更糟,由于摄像机的设计,他们的传感器关于亮度的数据并不是均匀分布的。相反,最亮灰度级对应所有数据的50%,降低一个级对应所有数据的25%,再降低一个级对应12.5%,这意味着3个最亮的灰度级对应所有数据的近90%!这意味着没有太多留给最黑暗的部分,意味着他们不会像高光那样有很明显的细节信息。因此,虽然相机可以捕捉10EV的场景信息,但很少有关于阴影的信息。这就是为什么我们需要特别注意正确捕捉阴影中的细节,这也是将图像正确曝光的原因。但即使是在正确的合适的曝光,我们也不会覆盖大多数情况下的整个动态范围。那怎么办呢。这个时候,HDR就该上场了。

(这里卖个关子,HDR的部分另外再做深入的探讨,这个章节,主要是探讨宏观上的理解。)

一般情况下,可在显示器上显示的图像,其每通道只有8位,一般显示器甚至不能显示16位图像。这意味着每个通道(即红色、绿色和蓝色)只能有255个不同的值。

HDR通常与每个通道32位的图像相关联。这就意味着每个通道可以存储更多的数据(32位精度允许4294967296个不同的值存储在一个通道中)。这足以以正确的方式表现现实生活中的场景。因此,HDR更多的是一种图像表示,而不是许多人将其与后处理技术联系在一起的技术。HDR与色彩饱和度过高、光晕或其他许多用户和摄影师抱怨的典型问题无关,它与重影、对齐等也没有关系。因为这些都是成像算法。

HDR是存储图像的概念,因此它包含所有必要的亮度数据。LDR(低动态范围-如典型照片)和HDR图像都可以看作是现实的模型,但事实是HDR更接近现实,因为它可以存储比典型LDR图像所能存储的更多亮度信息。也就是说,它能更好地代表现实。它捕获的信息不比现实场景中的信息多,但它可以捕获比我们看到的更多的信息。很多人认为HDR是不真实的。这其实是一种误解,主要还是因为我们看到的世界是彩色的,而显示器显示的是色调映射导致出现不真实的结果。

正如前面所说,直接在显示器上显示HDR图像有一个问题,因为当前一代的显示设备无法处理具有如此多不同亮度值的图像。

您可以尝试在一些应用程序中显示HDR图像,它基本上显示了图像曝光的一部分,阴影和高光中的许多细节无法显示,因为显示器无法显示它们。

由于我们希望能够在显示器上显示HDR图像,我们需要做的是将我们的高动态范围图像映射到显示器可以显示的亮度范围,也就是在一个称为色调映射的过程中将我们的图像转换回LDR图像。一开始这听起来可能很傻,因为捕获HDR图像只是为了将其转换回LDR,这个目的是什么?但是如果只是直接用相机拍摄LDR图像,再显示不就行了,为啥还要HDR转LDR?还是前面提到的,我们想看到更多细节信息。

色调映射可能是一个非常简单(甚至微不足道)或非常复杂的函数。以最简单的形式,它可以线性地缩放图像的所有亮度:

色调映射亮度像素=(亮度像素–最小亮度)/(最大亮度–最小亮度),

上面的运算符被称为线性色调映射运算符,是我能想到的最简单的运算符之一。但是描述一些色调映射的原理是很好的。它包含3个简单步骤:

1.将HDR图像转换为亮度图。

HDR是关于光和细节而不是颜色,因为它是非常真实的。光在计算机图形学中是发光的,亮度表示颜色(或在物理上基本相同的光)有多亮。你可能认为亮度是0.33*R+0.33*G+0.33*B计算的,其中R、G、B分别代表一个像素的红色、绿色和蓝色值。恐怕没那么简单,因为我们的眼睛对每一种波长的感知方式略有不同。蓝色似乎是我们眼中最暗的颜色,绿色是最亮的。所以研究人员提出了一些计算亮度的公式,例如:

亮度=0.299*R+0.587*G+0.114*B,(Photoshop使用的)

亮度=0.27*R+0.67*G+0.06*B

因为色调映射的第一步是计算所有像素的亮度。图像所有像素的亮度可以称为亮度图。正如你从上面看到的,也就是一个灰度图像。

2.色调映射。

色调映射的输入是第一步中计算的灰度图像。假设在HDR图像的情况下,红色、绿色和蓝色的值可能远远大于255,那么灰度值也大于255。因此,它需要将所有像素的亮度都压缩到0-255的范围。所以,您可以将色调映射视为无损耗压缩方法。此外,在这一步中,可能需要确保在阴影和高光中保留足够的细节(线性色调映射操作则不会,需要开发其他算法)。

也就是说,将大范围的亮度映射到显示器的亮度范围,而不是颜色。此步骤的输出是灰度图像,所有亮度映射到显示器可显示范围。

3.对色调映射图像应用颜色。

在这个阶段,亮度已经符合显示器可以显示的范围,但图像仍然是黑白的。所以在这一步我们只是恢复颜色。不同算法的计算方法不同,但在最简单的情况下,每个颜色通道的计算方法如下:

红色=HDR图像中红色的像素值*(第二步中色调映射后值/第一步中输出的灰度值)

这是一个红色通道的例子,但是绿色和蓝色频道也一样。当然,可能还有一些额外的步骤,比如伽玛校正。

以上内容就是带你对HDR有个初步的了解,即使你在做项目的时候,不会因为这些知识盲区,导致不能很好的理解。

本文已同步至订阅号: 麻瓜智能,欢迎关注!

发布了77 篇原创文章 · 获赞 150 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/Aoulun/article/details/103947134