【更新】我的新博客:www.ryuzhihao.cc,当然这个csdn博客也会更新
本文在新博客中的链接:点击打开链接
完成时间:2016年6月13日(大二下学期)
博客时间:2017年4月19日
SFS效果截图:
接触到SFS的一个契机,是我在大二期间做的一个ppt,这是我第一次去通过阅读各种论文来解决问题。如今过去一年了,在这一年里,我使用Qt+OpenGL做了很多关于计算机图形学(Computer Graphics)的小程序,涉及很多不同的方向,而阅读论文也渐渐变成了我的一个习惯,从中文paper到英文paper。关于image-based的重建,也有了其他的了解,也花了将近2个月的时间,完成了一个仿照visual SFM的多幅图像的三维重建程序(multi images-based)。现在,回头看当时写的这个单幅图像的三维重建,实在感慨万千啊!现在拿出当时做的这个一个小东西给大家分享。
说明:下面的图片都是从我的ppt里截图的,渣手绘……
Shape from shading的数学原理:
Shape from shading是由Horn于1980年提出的一种单幅图像恢复三维信息的一种方法(Single Image-based Reconstruction)。对于Lambert表面具有较好的效果。下面简要的介绍一下其基本步骤和原理:
1. 得到灰度图像I。
可以利用如下关系式计算:
gray = 0.3r + 0.59g + 0.11b;
2. 求出变换到光源坐标系的变换矩阵R
已知光源的两个偏角φs 和θs,并通过下面的关系式计算变换矩阵R:
3. 将矩阵R与原灰度图像I相乘,调整相机沿光源方向看去,得到新灰度图像E。
这一步实现了,从成像坐标系转换到光源坐标系。
4. 计算新灰度图像E沿x和y方向的梯度(Ex和Ey),其实就是求偏导。
5. 计算物体表面某点的倾角φ。
下图表示了什么是倾角φ:
关于倾角φ的计算,便是利用lambert表面的性质:
lambert余弦定理(Lambert Cosin Law)
我们利用Lambert Cosin Law 便可以很轻松的利用下面的关系式估计出某点的倾角:
任意亮度对应的倾角φi:Ei=Emax*cos φi
则,物体表面任意点的倾角φi即为:φi=arccos(Ei/Emax)
6. 计算物体表面某点的偏角θ。
下图表示了什么是偏角φ:
关于偏角θ,可以通过前面第4步求出的两个方向的梯度计算出来:
θi = arctan( Ey / Ex);
7. 计算在光源坐标系下,物体表面任意点的法向量(nx,ny,nz)
此时把物体表面任意面源仍看做是一个球体,此时在光源坐标系下,物体表面某点的法向量为:
n' = (nx,ny,nz);
其中:nx = sinφ*cosθ
ny = sinφ*sinθ
nz = cosφ
8. 计算在光源坐标系下,原图像某点对应的高度值:
height' = nz* 反射率。 (反射率可以根据材质选取)
9. 将结果从光源坐标系恢复到原成像坐标系:
只需将结果与如下的逆变换矩阵相乘即可