Toon posts:

[Matlab / C] Hotspot-correctie; functie fitten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben momenteel een experiment aan het opzetten waarin we gebruik maken van een (passief) 3D systeem. Opstelling is ongeveer als volgt:
Afbeeldingslocatie: http://129.125.220.228/hotspot_temp/image004.jpg

Een probleem van deze opstelling is dat er een 'hotspot' te zien is op het scherm. Dit komt er ruwweg op neer dat de luminantie/hoeveelheid licht in het centrum van het scherm veel hoger/groter is dan aan de randen. We hebben de luminantie voor vol wit (255,255,255) op 48 verschillende plaatsen op het scherm gemeten (mbv 8x6 grid).

In een plot ziet dit er voor de bovenste projector als volgt uit:
Afbeeldingslocatie: http://129.125.220.228/hotspot_temp/top.jpg

... en voor de onderste:
Afbeeldingslocatie: http://129.125.220.228/hotspot_temp/bottom.jpg

In m'n experimenten druk ik de kleuren uit in CIE-coordinaten, dus het is redelijk eenvoudig om de luminantie van iedere pixel te wijzigen zonder de chromaticiteit te beinvloeden. Om voor de hotspot te 'corrigeren' wil ik nu het volgende doen:

1. een functie fitten aan de gemeten data
2. op basis hiervan een (negatief) 'luminantie-veld' genereren dat over ieder frame wordt heengelegd en de luminantie van iedere pixel met de overeenkomstige waarde verlaagt.

Stap 2 is niet zo moeijlijk te implementeren, zodra ik eenmaal de benodigde functie heb. Mijn vraag is nu:

heeft iemand van jullie enig idee wat voor distributie er onder bovenstaande datapunten kan liggen? En/of hoe ik hiervoor een functie kan opstellen/fitten?

De data+plaatjes zijn ook te vinden op:
http://129.125.220.228/hotspot_temp/data0507.zip

Bij voorbaat dank voor eventuele hulp!

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Verwijderd schreef op 05 juli 2004 @ 19:59:
heeft iemand van jullie enig idee wat voor distributie er onder bovenstaande datapunten kan liggen? En/of hoe ik hiervoor een functie kan opstellen/fitten?
Als ik zo naar de situatie kijk, dan lijkt het me heel aannemelijk dat de hoeveelheid licht kwadratisch afneemt met de afstand tot het centrum. Dat klopt ook redelijk met de grafieken die je laat zien.

| Toen / Nu


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Misschien heb je hier iets aan (bij research staan een aantal papers): http://www.icwall.nl/icwall.html . Ze hebben daar hetzelfde probleem goed opgelost.

Verwijderd

Topicstarter
Zoijar: bedankt voor de URL! Dit kan inderdaad erg nuttig zijn. Zij beweren daar dat het met een 2e-graads polynoom kan worden benaderd:

lum(x,y) = a + b*r(x,y) + c*r(x,y)^2

waar r(x,y) de afstand tot het centrum van de hotspot is en a,b,c nader te bepalen parameters. Zal het morgen 's even proberen...

SuperRembo: waarom denk jij dat de hoeveelheid licht vanaf het centrum kwadratisch afneemt? Als bovenstaande functie een redelijke fit oplevert, zat je er niet ver naast, maar ik vraag me af wat je redenatie erachter is :). Ik zat zelf eerder aan een Gaussische verdeling te denken (maar die lijkt niet goed te fitten).

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Verwijderd schreef op 05 juli 2004 @ 21:04:
SuperRembo: waarom denk jij dat de hoeveelheid licht vanaf het centrum kwadratisch afneemt? Als bovenstaande functie een redelijke fit oplevert, zat je er niet ver naast, maar ik vraag me af wat je redenatie erachter is :). Ik zat zelf eerder aan een Gaussische verdeling te denken (maar die lijkt niet goed te fitten).
Lijkt me eigenlijk middelbare school natuurkunde. De verlichtingssterkte = lichtsterkte / (kwadraat van de afstand). Doordat het scherm niet loodrecht op de lichtbron staat krijg je die lineaire term erbij.
(Niet helemaal 100% correct geformuleerd, ik weet het)

| Toen / Nu


Verwijderd

Ik weet niet precies wat de toepassing is waarin je het systeem gaat gebruiken, maar je zou eens met een gaussisch filter kunnen gaan spelen. Je maakt een gefilterde Gauss-afbeelding met een sigma van 5 en trekt deze gefilterde afbeelding vervolgens af van je oorspronkelijke afbeelding.

Verwijderd

Topicstarter
SuperRembo schreef op 05 juli 2004 @ 22:13:
[...]

Lijkt me eigenlijk middelbare school natuurkunde. De verlichtingssterkte = lichtsterkte / (kwadraat van de afstand). Doordat het scherm niet loodrecht op de lichtbron staat krijg je die lineaire term erbij.
(Niet helemaal 100% correct geformuleerd, ik weet het)
Daar zit wel wat in ja. Maar ik ben bang dat het hier iets gecompliceerder is. Het scherm is namelijk doorzichtig en de projectors bevinden zich in het 'blikveld' van de kijker, die dus ahw rechstreeks in de lampen zit te kijken. De locatie v/h centrum v/d 'hotspot' is dan ook afhankelijk van de positie van de kijker. Als je met front-projection werkt of de projectors zo hoog/laag opstelt dat er geen lijn tussen oog en projector is die door het scherm gaat, dan klopt het wel denk ik. Of zie ik dit verkeerd??

Ik heb net mbv "nlinfit" (Matlab) de parameters van bovenstaande functie geschat, maar daar lijkt niet veel zinnigs uit te komen (de som van de residuals is weliswaar in de orde van 10e-5, maar de som van de abs van de residuals niet; die is in de orde van 10e3).

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Ik heb nog eens ff met matlab lopen stoeien.
Ik ben uitgegaan van de volgende benadering:
f(x,y) = som(over i,j) ci,j x i y j
met i,j = 0 ... np-1
Er zijn dan np2 coefficienten.

Je kan dat schrijven als:
F = X*C*Y'
dus
C = inv(X'*X)*X'*F*Y*inv(Y'*Y);
(in plaats van die inv() zijn er vast nettere methoden om het op te lossen, maar dat is te ver weg gezakt)

Vanaf np=5 (4e orde polynomen) komt de benadering vrij goed overeen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
close all

%params
nx = 8;
ny = 6;
x = [1:nx]';
y = [1:ny]';
px = x*ones(1,ny);
py = ones(nx,1)*y';
np=5;

%load data
temp = load('PW_grid_8by6_bottom.out');
bottom = reshape(temp(:,5), nx, ny);
temp = load('PW_grid_8by6_top.out');
top = reshape(temp(:,5), nx, ny);

%fit
[Cbot, Fbot, Fboterr] = fit(bottom, x, y, np);
[Ctop, Ftop, Ftoperr] = fit(top, x, y, np);

%plot
figure
surf(px, py, bottom);
title('bottom measurement');

figure
surf(px, py, Fbot);
title('bottom estimate');

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function [C, Fest, Ferr] = fit(F, x, y, np) 

nx = size(x,1);
ny = size(y,1);

X=zeros(nx,np);
Y=zeros(ny,np);
for p=[1:np]
    X(:,p) = x.^(p-1);
    Y(:,p) = y.^(p-1);
end

% F = X*C*Y' => 
C = inv(X'*X)*X'*F*Y*inv(Y'*Y);
Fest = X*C*Y';
Ferr = F-Fest;

| Toen / Nu


Verwijderd

Topicstarter
SuperRembo:

Bedankt voor je hulp! Ik ben zelf wat met een Gaussian aan het spelen geweest en die leverde ook een aardige fit op. Jouw fit is iets beter, maar alleen in de gevallen voor np>4.

Maar dit betekent dat er alleen een 'goede' fit is voor 4e-graads (of hogere) polynomen. En dit lijkt me niet in overeenstemming met je hypothese dat het licht kwadratisch afneemt met de afstand (in dat geval zou ook een 2e-graads polynoom een aardige fit moeten leveren, ervan uitgaande dat de data van enige kwaliteit is).

Als ik np=3 kies krijg ik echter gemiddelde relatieve errors van >23% (berekend door de relatieve error voor ieder datapunt te berekenen, te sommeren en te delen door het aantal datapunten). Een gauss-fit levert volgens dezelfde berekening een error van 10-15% op.

Ik ben nu bezig om een Lambertische proberen te fitten ('cosine law'). Misschien dat dat het onderliggende fysische model wat beter beschrijft en, derhalve, betere resultaten levert.
Pagina: 1