关闭

曝光算法

标签: 计算机图形
769人阅读 评论(0) 收藏 举报
分类:

曝光

真实世界是什么样子的?
好吧,真实世界的某些位置非常暗:山洞、煤炭、夜晚的床底;有些地方不是那么地暗:傍晚、沙滩、人的脸;有些部分是亮的:白衬衫、雪、风帆、灯泡;有些物体真的很亮:聚光灯、天空、太阳和激光。

计算机图形学看起来是什么样子的?
展示到电脑屏幕上的图像的亮度范围是有限的,通常从0(深灰色)到256(暗淡的白色)。

知道了这些,我们怎么可能用计算机屏幕来逼真地展示真实世界中的图像?大自然有着如此大的亮度范围,而计算机屏幕只能展示其中非常小的一个波段。你也许试过将大自然的亮度缩放到屏幕可以表达的范围内,如将黑暗的洞穴表示为0,将太阳表示为255。但是如果你真的这样做,你会发现在表示诸如人脸这类事物的时候非常不准确。它们看起来非常地暗。下图中的太阳亮度为255,虽然能很好地展示太阳,但天空显得有点暗,而大地简直看起来像是处在黑暗之中。
这里写图片描述

另一种方法就是限制亮度值。例如:任何比雪更亮的东西以亮度255来表示。下图中的图像由这种方式来表示。地面看起来挺不错,但是天空看起来比地面亮很多,而且差不多是全白的。你看不到太阳,而云就好像是一大片浅蓝色背景中的一团白色。
这里写图片描述

现在来提问:
相片看起来是什么样子的?
好比电脑屏幕,相片本身也只有一段较窄的亮度范围。相片上最暗的物体看起来不是那么地暗,最亮的部分也并不比我们所看到的真实环境中的那部分更亮。
那么,相片为何似乎并没有遇到电脑屏幕那样的显示问题呢?好吧,事实上它也会遇到这个问题,只是相片能更好地处理大范围的光强。并且有曝光控制。了解相片是如何拍摄的会有利于帮助我们理解这两点。
拍照
拍照时,相机中的快门短时间内开启来接收被拍摄场景内的光照。光照被相机镜头聚焦到一片感光胶片上。胶片上含有的化学物质在遇到光照时分解,如此,场景被记录下来。被分解的化学物质越多,成像相片就会看起来越亮。
进入相机镜头的光强能通过控制相机快门开启的时长(曝光)和快门光圈(fstop)来调节。
接下来,停止胶片的感光性能并成像得到负片。再让光线通过负片照射相纸来生成最重的相片。
这个过程和计算机图形又有什么关系呢?
刚才那个简单的拍照模型告诉我们为什么相机更擅长处理大范围的光强。现在把最初的曝光胶片想象成场景中的光。假设在胶片的一小部分区域内有100个感光化学物质的分子。光线照射到这片区域,其中一半的分子分解了。那么得到的图像将有着一半的亮度。假设同样分量的光再次照射到这片区域,那么还没分解的分子中又会有一半的分子分解,即还剩下1/4未分解。得到的图像将有着75%的亮度。随着越来越多的光线照射到这片区域,越来越多的分子被分解。另一方面,随着胶片上的未分解分子越来越少,你将需要越来越多的光照来分解等量的分子。
这张图表示了随着光线逐渐增多,胶片上的可分解物质的剩余情况。最初化学物在迅速分解,然而,随着越来越少的未分解分子剩余,分解速度也迅速降低,最后当所有分子都被分解后,即停下。
这里写图片描述

事实上,这是一个相当简单的图表。真实的曲线是不会如此平滑简单的。事实上,当胶片接收大量光照时,曲线将再次正增长。这种现象就是所谓的“曝光过度”。
这里写图片描述

你可能看出来了这是一个指数曲线,没错,就是指数曲线。下降速率和未分解化学物质的量成比例。
因此,参考上一个图表,第二幅图只是简单地将第一幅图翻转即可得到当一定量的光照射到透明胶片时它会变成什么样子和最终的相片会有多亮。
这里写图片描述
总之,上述可表示为一个简单的公式:
brightness = 1 - e-light
现在你知道了这个简单的公式,你现在有足够的能力来处理大范围亮度场景并让它在电脑屏幕上显示良好。不相信我?看看以下图片。这和之前的两张图是一样的场景,不过实施了曝光函数(Exposure Function)。太阳比天空更亮,天空比地面更亮,理应如此。所有的细节仍可见,没有失去的部分。
曝光控制(Exposure Control)
当然,相机如果没有曝光控制就会变得毫无用处,这个函数也是如此。击中胶片的光强量被简单表示为进入相机的光线、光圈和快门开启的时长的乘积。更进一步简化,我们忽略光圈和快速速度的区别,把它们简单表示为变量K,K越小,成像亮度约暗,反之亦然。
(light hitting film) = (light entering camera) * K

brightness = 1 - e-(light hitting film)
最后,我们来看一段伪代码:
function Expose(float light, float exposure)

return ( 1 - exp(light * exposure) )  *  255

end function

main procedure:

for every pixel on the screen

  calculate the amount of light entering the camera for this pixel, by Ray Tracing or whatever
  call this value L        

  PixelValue = Expose(L, K)

  plot this pixel with a brightness of PixelValue      

end of loop

end of main procedure

很神奇这个函数并没有大量使用。即便是诸如3D studio这种强大的渲染引擎,也不允许创建亮度大于255的光照。这种限制非常滑稽,因为在现实生活中,光线的亮度范围是很大的。
参考:
The Virtual Darkroom http://tangle.seas.gwu.edu/~geigel/vdr/
一个以相机胶片处理原理来生成黑白计算机图像的系统。该系统比上述简单的算法更高级,并且模拟grain和曝光过程。

原文地址:http://freespace.virgin.net/hugo.elias/graphics/x_posure.htm

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2832次
    • 积分:74
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:4篇
    • 译文:5篇
    • 评论:0条
    文章分类