[Go to Previous] [Go to Index] [My Homepage]

3. Experimental Results

My results can be viewed in the following seperate pages:


Strength and weakness

(1) The basic algorithm works well for the test data. However, this algorithm relies the chrome ball.

(2) The example-based normal estimation algorithm is easy to use. However, it does not perform very well on some images, such as rock. The reason is that the materials may be different between the query object and the reference object. In addition, the assumption that a reference object with the same lights exists may not always be true in some situation.

(3) The Hayakawa's normal estimation algorithm does not use the chrome ball. The constraint to avoid ambiguity of the normals is the key. In my experiment, I found that the second constraint works poorly. So I chose the first one. However, I still tried many times to get a best set of six pixels. The results are sensitive to the choice of pixels. I cannot find a good set for gray. An improved algorithm is presented in [4]. In addition, I do not consider the shadows in my implementation, which may be solved by considering the reconstruction errors of the image data matrix by SVD. The shadows may bring some errors, e.g. the View 2 of depth in rock shows the left-bottom corner is inaccurate.

(4) Frankot-Chellappa Algorithm is much faster than least squares fit, though I found some outliers in its results, e.g. owl. The outliers are probably due to the surface normal having too small of a nz component, because a small absolute error there would result in a large relative difference in p(x,y) = -nx/nz and q(x,y) = -ny/nz. For the least squares fit, as nz is the weight for each linear equation, this problem does not exist.

Appendix  User Interface

Download the executable file and test data and unzip them. Then move the folder psmImages to the same directory of Psm.exe and make sure that ANN.dll and libfftw3-3.dll are in the same directory.

Double click Psm.exe and start your use.

1. Basic Algorithm
  • "File" menu -> "Open Images", choose chrome.txt
  • "Solve" menu -> "Lighting Directions"
  • "File" menu -> "Open Images", choose buddha.txt
  • "Solve" menu -> "Normals"
  • "Solve" menu -> "Albedo Map"
  • "Solve" menu -> "Depths"

2. Example-based Normal Estimation
  • "File" menu -> "Open Images", choose buddha.txt
  • "Bonus" menu -> "Open Reference Images", choose gray.txt
  • "Bonus" menu -> "Example-based Normals"
3. Normal Estimation without Lighting Directions
  • "File" menu -> "Open Images", choose buddha.txt
  • "Bonus" menu -> "Open Sample Points for Normals", choose buddha_s6.txt
  • "Bonus" menu -> "Normals without Lighting Directions"
4. Frankot-Chellappa Algorithm
  • Obtain normals with any of the above three methods
  • "Bonus" menu -> "Depths by Frankot-Chellappa"


[1] Woodham. Photometric Stereo. Optical Engineering, 1980.

[2] A. Hertzmann, S. M. Seitz. Example-Based Photometric Stereo: Shape Reconstruction with General, Varying BRDFs.  IEEE Trans. PAMI, Vol. 27, No. 8, pages 1254--1264, 2005.

[3] H. Hayakawa. Photometric stereo under a light source with arbitrary motion. Journal of the Optical Society of America, Vol. 11, No. 11, pages 3079--3089, 1994.

[4] R. Basri, D. Jacobs and I. Kemelmacher. Photometric stereo with general, unknown lighting. Int. J. Computer Vision, Vol. 73, No. 3, pages 239--257, 2007.

[5] Frankot, R.T. and Chellappa, R. A method for enforcing integrability in shape from shading algorithms. IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. 10, No. 4, pages 439--451, 1988.

[6] ANN library: http://www.cs.umd.edu/~mount/ANN/.

[7] FFTW library: http://www.fftw.org.

[8] CLAPACK library: http://www.netlib.org/clapack/.

[Go to Previous][Go to Index]


Copyright (c) 2009 Wei Zhang