Activity 13: Photometric Stereo

August 7, 2008 at 11:13 am (Uncategorized)

We consider a point light source from infinity located at . The intensity as captured by the camera at image location (x,y) is proportional to the brightness . Thus we have

then

where

We can approximate the shape of an object by varying the light source and taking the picture of the image at various locations. The (x,y,z) of the light sources are stored in the matrix V.

Thus, we have

which are the the (x,y,z) locations of the N sources. The intensity for each point in the image is given by

or in matrix form

Since we know I and V, we can solve for g using

We get the normalize vectors using

After some manipulations we can compute the elevation z=f(x,y) using at any given (x,y) using

code:
loadmatfile(‘Photos.mat’);

V(1,: ) = [0.085832 0.17365 0.98106];
V(2,: ) = [0.085832 -0.17365 0.98106];
V(3,: ) = [0.17365 0 0.98481];
V(4,: ) = [0.16318 -0.34202 0.92542];

I(1, : ) = I1(: )’;
I(2, : ) = I2(: )’;
I(3, : ) = I3(: )’;
I(4, : ) = I4(: )’;

g = inv(V’*V)*V’*I;
g = g;
ag = sqrt((g(1,:).*g(1,: ))+(g(2,:).*g(2,: ))+(g(3,: ).*g(3,: )))+1e-6;

for i = 1:3
n(i,: ) = g(i,: )./(ag);
end

//get derivatives

dfx = -n(1,: )./(nz+1e-6);
dfy = -n(2,: )./(nz+1e-6);

//get estimate of line integrals

int1 = cumsum(matrix(dfx,128,128),2);
int2 = cumsum(matrix(dfy,128,128),1);
z = int1+int2;
plot3d(1:128, 1:128, z);

I give my self 10 points for this activity because there is high similarity in the shape of the actual object and photometric stereo.

Collaborators: Cole, Benj, Mark

Leave a comment