Stap 3: Controleer uw resultaten: hoe te schrijven van uw eigen versie van CEMENT en testen om te zien hoe goed het werkt!
Hoe kunnen we weten hoe goed werkt CEMENT?
Een manier om het te testen is om 3 foto's van een scène of object verlicht door 2 lampjes, zoals hierboven weergegeven (uit onze ICIP2004 papier; zie referentie aan einde van papier).
De eerste foto, de oproep het "v1.jpg", is een foto genomen met een licht ingeschakeld. Roepen dat een licht lamp 1. In ons geval is dat de lamp aan de linkerkant van onze studio ruimte (Let op hoe het werpt schaduwen aan de rechterkant van hun overeenkomstige objecten).
De tweede foto, de oproep het "v2.jpg", is een foto met dat licht uitgeschakeld en een ander licht ingeschakeld, zeg lamp 2 ingeschakeld, dus v2 is de foto zoals alleen verlicht door lamp 2. In ons geval, lamp 2 is het het recht van onze studio ruimte (Let op hoe het werpt schaduwen aan de linkerkant van hun overeenkomstige objecten).
De derde foto, de oproep het "v3.jpg", is een beeld met beide lichten ingeschakeld samen. Merk op hoe wij het zien van dubbele schaduwen in deze foto.
Nu probeer CEMENTing v1 en v2 samen, noemen het resultaat "v12.jpg".
Nu test om te zien hoe gelijkaardige v12 is aan v3.
De gemakkelijkste manier om te lezen van deze beelden in een array is om de raw beelden te downloaden:
«««http://wearcam.org/instructableCEMENT/octave_scrip...
«««http://wearcam.org/instructableCEMENT/octave_scrip...
«««http://wearcam.org/instructableCEMENT/octave_scrip...
maar hebt u een langzame netto-verbinding, gewoon pak de .jpeg-afbeeldingen en decomprimeren van hen:
djpeg-grijs v1.jpg > v1.pgm
djpeg-grijs v2.jpg > v2.pgm
djpeg-grijs v3.jpg > v3.pgm
vervolgens uit de header bewerken zodat u de onbewerkte gegevens, opgeslagen, laten we zeggen, als de bestanden "v1", "v2" en "v3".
U kunt dit doen in Matlab, maar als je in de ware geest van DIY, zult u liever met het gratis + opensource-programma "octave": sudo apt-get install octaaf, en probeer dit:
fid1=fopen('v1');
fid2=fopen('v2');
fid3=fopen('v3');
v1=fread(fid1,'uint8');
V1=reshape(v1,2000,1312); deze dimensies zijn ervan uitgaande dat u hebt gedownload van 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))
Die wordt geretourneerd:
e = 9.0995e + 09
Als u hebt gedownload van Instructables, de afmetingen van de afbeelding kunnen hebt gewijzigd, bijvoorbeeld als de dimensies iets van 1024 bij 672 zijn en wijzigt u vervolgens de bovenstaande opdrachten omvormen:
V1=reshape(v1,1024,672);
en hetzelfde geldt voor de V2 en V3.
We hebben twee net de twee single-lamp afbeeldingen samen in octaaf, door simpelweg het toevoegen van hen samen en getest om te zien hoe vergelijkbaar zij zijn naar de afbeelding met beide lampjes op gecementeerd.
Nu in plaats van deze toe te voegen, probeer het nemen van de vierkantswortel van de som van de kwadraten, d.w.z. als een metriek "afstand":
V12=sqrt(v1.^2+v2.^2);
e=Sum(Sum((V12-v3).^2))
en wat je krijgt is een veel lagere fout:
ans = 6.5563e + 08
Nu proberen cubing hen en het nemen van de kubus wortel; Hier is de fout nog steeds een beetje lager:
ans = 2.2638e + 08
Meer in het algemeen, kunnen we verhogen hen tot sommige exponent, n, en neem dan de wortel van n. Natuurlijk hoeft niet n noodzakelijkerwijs een integer zijn. Dus laten we proberen een hele hoop verschillende "n" waarden en een grafiek van de fout worden uitgezet als functie van de "n". Kunnen we dit mooi door het schrijven van een eenvoudige Octave-functie in een bestand genaamd "err.m":
functie err=err(v1,v2,v3,N)
if(nargin~=4)
DISP ("err moet precies 4 Invoerargumenten: v1, v2, v3, n");
eind % als
if(Max(size(N))) > 1
DISP ("err alleen aanbiedingen met vector N, niet matrices van N");
eind % als
voor k=1:length(N)
n=N(k);
V12=(v1.^n+v2.^n).^(1../n);
Err (k) = sum(sum((v12-v3). ^ 2));
eind % voor
Nu in een lange lijst we CEMENT voor een hele hoop van de "N" waarden testen kunnen, bijvoorbeeld laten we proberen 1000 verschillende N waarden, gaande van 1 tot en met 10:
N=(1:.01:10).';
De fout voor elk van deze bestaat uit:
e=Err(v1,v2,v3,N);
dat is ten minste ongeveer 3.27 of 3,28 (dicht bij gelijke voor die waarden van N), dus laten we zeggen dat de optimale waarde van de "N" 3.275.
De optimale waarde van de "N", is afhankelijk van de functie van de reactie van een specifieke camera, die in mijn geval de Nikon D2h is.
Anderen die hebben gedaan dit Instructable verslag "N"-waarden voor andere camera's, dus stel ik voor de oprichting van een "massale Superposimetric Chart' net als de"The Massive Dev grafiek"voor de film:
Massale Superposimetric grafiek:
Camera maken en model nummer "n" Response functie
Nikon D2H 3.275
Nikon D60 3.3
Sony RX100 2.16
Canon Powershot S50 2.1875
Verder te gaan:
We hebben hier een eenvoudige machtswet voor illustratieve doeleinden gebruikt, maar in feite kunnen we iets veel krachtiger: we kunnen eigenlijk ontgrendelen de geheimen van een camera, niet-versterkten, d.w.z. bepalen zijn ware antwoord functie, van drie foto's, zoals hierboven, maar in plaats van voor een "n" op te lossen we oplossen voor de 256 vermeldingen van de functie van quantimetric camera reactie. Zie bijvoorbeeld: