Poisson scaling

1. When the variable of Poisson (mu) is scaled by a factor of k(conversion gain * analog gain), the new random variable is no longer Poisson. 2. The scaled varaible has new mean of (k * mu) and new variance of (k^2 * mu). So the std of the new distribution will be k * (mu)^0.5 new mean = log(k * mu) = log(k) + log(mu) new std = log(k * mu^0.5) = log(k) + 0.5 * log(mu) 3. If there is only Poisson noise, the conversion gain can be derived given mean and std with several digital values at several levels. Plot log(new mean) vs log(sqrt(new mean)) should have a slope of 0.5. The offset is the log of the scale factor. There is only Photon noise and with conversion gain and analog gain, k should be smaller than 1. 4. If there is electronic noise, the results might be different.

Contents

Suppose these are the photon absorptions - without any other noise

lambda = logspace(1,3,10);
nSamp  = 100;
useSeed = 1;
photons = zeros(numel(lambda),nSamp);
for ii=1:numel(lambda)
    photons(ii,:) = poissrnd(lambda(ii),nSamp,useSeed);
end

In that case, we have the mean and standard deviations as follows

mPhotons = mean(photons,2);
sPhotons = std(photons,0,2);
ieNewGraphWin;
loglog(mPhotons,sPhotons,'k--');
axis equal; grid on

Suppose we have a conversion gain of 100 photons per dv

% No other noise
dvPerPhoton = 0.01;
dv = photons*dvPerPhoton;

mDV = mean(dv,2);
sDV = std(dv,0,2);
rootDV = sqrt(mDV);

ieNewGraphWin;
loglog(mDV,sDV,'k--',mDV,rootDV,'b--')
axis equal; grid on

Create a Sony sensor and run some simulations

sensor = sensorCreate('imx363');
sensor = sensorSet(sensor,'row',500);
sensor = sensorSet(sensor,'col',500);

scene = sceneCreate('macbeth');
scene = sceneSet(scene,'fov',10);
oi = oiCreate('diffraction limited');

sensor = sensorSet(sensor,'exp time',0.016);

oi = oiCompute(oi,scene);
sensor = sensorCompute(sensor,oi);
sensorWindow(sensor);

% [col row width height], (x,y,width,height)
rect = [186 340 44 46];
sensor = sensorSet(sensor,'roi',rect);
sensorGet(sensor,'roi rect')
dv = sensorGet(sensor,'roi dv',rect);

nanmean(dv)
nanstd(dv)
ans =

   186   340    44    46


ans =

  251.0870  528.1306  355.9257


ans =

   12.9803   20.6408   15.2645

END