Skytte för en hemsida funktion: Timelapse och Multi-exponering fotografi DIY Hur (göra eller skriva egen kod!) (3 / 6 steg)
Steg 3: Kontrollera dina resultat: hur man skriver en egen version av CEMENT och testa den för att se hur väl det fungerar!
Hur vet vi hur bra CEMENT fungerar?
Ett sätt att testa det är att ta 3 bilder på en scen eller ett objekt upplyst av 2 lampor, som visats ovan (från vår ICIP2004 papper, se referens i slutet av papper).
Den första bilden, kalla det "v1.jpg", är en bild tagen med en ljus påslagen. Kalla den en ljus lampan 1. I vårt fall, det är lampan till vänster om vår studio utrymme (märker hur det kastar skuggor till höger om deras motsvarande objekt).
Den andra bilden, kalla det "v2.jpg", är en bild med att ljus avstängd och en annan ljus påslagen, säger lampa 2 påslagen, så v2 är bilden som upplyst endast av lampa 2. I vårt fall, lampa 2 är det höger vår studio utrymme (märker hur det kastar skuggor till vänster om deras motsvarande objekt).
Den tredje bilden, kalla det "v3.jpg", är en bild med båda lamporna vände tillsammans. Lägg märke till hur vi ser på dubbla skuggor i bilden.
Försök nu CEMENTing v1 och v2 tillsammans, kalla resultatet "v12.jpg".
Nu test för att se hur lika v12 är att v3.
Det enklaste sättet att läsa in dessa bilder i en matris är att hämta raw-bilder:
http://wearcam.org/instructableCEMENT/octave_scrip...
http://wearcam.org/instructableCEMENT/octave_scrip...
http://wearcam.org/instructableCEMENT/octave_scrip...
men om du har en långsam netto-anslutning, bara ta jpg-bilder och dekomprimera dem:
djpeg-grå v1.jpg > v1.pgm
djpeg-grå v2.jpg > v2.pgm
djpeg-grå v3.jpg > v3.pgm
redigera sedan ut huvudet så att du har rådata, sparade, låt oss säga, som filer "v1", "v2" och "v3".
Du kan göra detta i Matlab, men om du är i sann DIY-anda, föredrar du att använda gratis + opensource program "oktav": apt-get install octave och sedan prova detta:
fid1=fopen('v1');
fid2=fopen('v2');
fid3=fopen('v3');
v1=fread(fid1,'uint8');
V1=reshape(v1,2000,1312); % dessa dimensioner förutsatt att du hämtat från wearcam
v2=fread(fid2,'uint8');
V2=reshape(v2,2000,1312);
v3=fread(fid3,'uint8');
V3=reshape(v3,2000,1312);
colormap("Gray");
Image(v1/4);
Image(v2/4);
Image(v3/4);
V12 = v1 + v2;
e=Sum(Sum((V12-v3).^2))
Som returnerar:
e = 9.0995e + 09
Om du hämtat från Instructables, bilddimensioner kan ha ändrats, t.ex. om måtten något liknande 1024 av 672, sedan ändra ovanstående omforma kommandon för att:
V1=reshape(v1,1024,672);
och samma för V2 och V3.
Vi har bara cementerade två två single-lampa bilderna tillsammans i Octave, genom att lägga dem tillsammans, och testade att se hur lika de är att bilden med båda lamporna på.
Nu i stället för att lägga till dem, prova att ta kvadratroten ur summan av deras kvadrater, dvs som ett "distans" mått:
V12=sqrt(v1.^2+v2.^2);
e=Sum(Sum((V12-v3).^2))
och vad du får är en mycket lägre fel:
ans = 6.5563e + 08
Nu kan du prova cubing dem och med kubikrot; här är felet lite lägre ändå:
ans = 2.2638e + 08
Mer allmänt kan vi höja dem till vissa exponent, n, och sedan ta nth roten. Naturligtvis behöver inte n nödvändigtvis vara ett heltal. Så låt oss prova en hel massa olika "n" värden och rita ett diagram över felet som funktion av "n". Vi kan göra detta snyggt genom att skriva en enkel Octave funktion i en fil med namnet "err.m":
funktion err=err(v1,v2,v3,N)
IF(nargin~=4)
Disp ("err måste ha exakt 4 indataargument: v1, v2, v3, n");
avsluta % om
IF(max(size(N))) > 1
Disp ("err endast behandlar vektor N, inte matriser av N");
avsluta % om
för k=1:length(N)
n=N(k);
V12=(v1.^n+v2.^n).^(1../n);
fela (k) = sum(sum((v12-v3). ^ 2));
slutet % för
Nu kan vi testa CEMENT för en hel massa "N" värden i en lång lista, t.ex. Låt oss försöka 1000 olika N värden går från 1 till 10:
N=(1:.01:10).';
Fel för alla dessa är i:
e=ERR(v1,v2,v3,N);
som är minst cirka 3,27 eller 3.28 (nära lika för dessa värden på N), så låt oss säga att den optimala värdet på "N" är 3.275.
Den optimala värdet på "N" beror på en viss kamera, som i mitt fall är Nikon D2h svar funktion.
Andra som har gjort detta Instructable rapport "N" värden för andra kameror, så jag föreslår skapandet av en "massiv Superposimetric diagram" ungefär som "The massiva Dev diagram" för filmen:
Massiv Superposimetric diagram:
Kamera märke och modell nummer "n" svar funktion
Nikon D2H 3.275
Nikon D60 3.3
Sony RX100 2.16
Canon Powershot S50 2.1875
Gå längre:
Vi har använt en enkel makt lag här illustrativ, men i själva verket kan vi göra något mycket starkare: vi kan faktiskt låsa upp hemligheter av någon kamera, icke-parametriskt, dvs bestämma sin sanna svar funktion, från tre bilder, som ovan, men istället för att lösa ett "n" vi lösa för 256 quantimetric kamera svarsposter-funktion. Se till exempel: