Shape from Shading(sfs)是一个很基础也很经典的3D重建方法。其基本原理是利用灰度图片的亮度信息,加上亮度生成原理,求得每个像素在3D空间中的法向量,最终根据法向量求得深度信息。
看了不少相关的文章,感觉这篇论文讲的最好懂,里面还有相应的matlab代码。所以想学sfs的同学,可以去看这篇论文。
问题描述
一张灰度图的亮度信息由4个因素决定:
1、光照:主要是方向,位置和光的能量分布
2、物体的表面反射率:在sfs中就是albedo,决定了入射光在物体表面上如何被反射出去,一般由物体表面的材质决定。
3、物体表面的几何性状:这个是在给定灰度图片时,我们要求的。
4、相机:主要是其内部参数和外部参数
在给定一个3D模型,通过光照以及物体的反射率,我们可以模拟相机渲染出一张2D图片。而sfs刚好是这个过程的逆向:一定一张图片,光照以及模型的表面反射率,我们需要求出物体的3D结构。
术语
法向量
如图所示曲面的法向量是垂直于曲面的一个向量。法向量与光照共同决定了图片亮度的生成。
曲面上的某一点(x,y,z)的单位法向量 n=(nx,ny,nz) n = ( n x , n y , n z ) ,有两种表示方法。一种是用偏角 τn τ n 和倾角 σn σ n 表示。
n=(nx,ny,nz)=[sinσncosσn,sinσnsinτn,cosσn]T n = ( n x , n y , n z ) = [ sin σ n cos σ n , sin σ n sin τ n , cos σ n ] T
其中, τn=tan−1(n