Examples of Poisson noise and extraction of information

Matlab codes

% Program to improve S/N ratio in small factor steps of 2^0.1 = 1.0718 of a

% 16-bit tif photograph (copyright Nyah Willmott)

clear; close all;

vid = VideoWriter('poissonNoise.mp4','MPEG-4');

vid.Quality = 100;

vid.FrameRate = 15;

open(vid);

set(0,'defaultfigurecolor',[1 1 1]);

set(gca,'linewidth',7);

I = imread('zurich.tif'); % input image

J = rgb2gray(I); % convert to b&w

K = imresize(J,0.35); % rescale image to more practical size

for i = 16:-0.1:0

factor = 2^i;

L = K/factor; % reduce bit range. Reduces each pixel to round(val/factor)

M = imnoise(L,'poisson'); % Add Poisson noise

N = M*factor; % Multiply up again, now with noise added

imshow(N);

bits = round(16.4 - i);

str1 = num2str(bits,'% 2i');

if (bits >=1 )

if (bits == 1)

str2 = ' bit';

else

str2 = ' bits';

end

strTot = [str1,str2];

hText = text(1600, 1190, strTot, 'FontSize',16,'Color','white');

end

frame = getframe(gcf);

writeVideo(vid,frame);

end

% Output the movie as an mpg file

close(vid);

% Program to improve S/N ratio in small factor steps of 2^0.1 = 1.0718 of a

% 16-bit tif photograph (copyright Nyah Willmott)

clear; close all;

vid = VideoWriter('poissonNoiseCroppedRegion.mp4','MPEG-4');

vid.Quality = 100;

vid.FrameRate = 15;

open(vid);

set(0,'defaultfigurecolor',[1 1 1]);

set(gca,'linewidth',7);

I = imread('zurich.tif','PixelRegion',{[1554,1680],[1760,1873]}); % input image

J = rgb2gray(I); % convert to b&w

for i = 16:-0.1:0

factor = 2^i;

L = J/factor; % reduce bit range. Reduces each pixel to round(val/factor)

M = imnoise(L,'poisson');

N = M*factor;

imshow(N);

bits = round(16.4 - i);

str1 = num2str(bits,'% 2i');

if (bits >=1 )

if (bits == 1)

str2 = ' bit';

else

str2 = ' bits';

end

strTot = [str1,str2];

hText = text(1600, 1190, strTot, 'FontSize',16,'Color','white');

end

frame = getframe(gcf);

writeVideo(vid,frame);

end

% Output the movie as an mpg file

close(vid);

% Program to generate signal with noise and background with noise, fit them

% via a least squares fitting function provided by matlab, and plot the

% progress of the fit with number of scans.

% The function is a constant background with amplitude = 25, a peak signal

% with height = 2, centred at x = 250 and with a SD value of 16.

clear;

close all;

figure('units','pixels','position',[0 0 1920 1080],'ToolBar','none');

vid = VideoWriter('snr.mp4','MPEG-4');

vid.FrameRate = 60;    % Default 30

vid.Quality = 100;    % Default 75

open(vid);

set(0,'defaultfigurecolor',[1 1 1]);

set(gca,'linewidth',7);

philBlue = [0.3 0.28 0.55];

numScans = 2000; % Number of scans

scanLength = 500; % Length of any given scan

sigPos = scanLength/2; % Place peak signal ideally at centre of scan

sigma = 16; % SD in Gaussian description of peak signal

xx = 1:scanLength; % x-coordinate of scan

bckav = 25; % Average background signal

sigpk = 2; % Average signal peak above background

backSig = zeros(1,scanLength); % Initialized background signal

sig = zeros(1,scanLength); % Initialized peak signal

% Initialize plots of progress in fitting

sigPkArray = zeros(1,numScans);

sigPosArray = zeros(1,numScans);

sigSigmaArray = zeros(1,numScans);

bckArray = zeros(1,numScans);

for i = 1:numScans

subplot(4,5,[1,2,3,4,6,7,8,9,11,12,13,14,16,17,18,19])

newplot

hold off

% Simulated background with Poisson noise

backSig = backSig+poissrnd(bckav*ones(1,scanLength));

% Idealized peak signal

perfSig = sigpk*exp(-(xx - scanLength/2).^2/(2*sigma^2));

% Simulated peak signal with Poisson noise

sig = sig+poissrnd(perfSig);

% Add up simulated noisy signals and normalized by dividing by i

totSig = (sig + backSig)/i;

plot(xx,totSig,'color',philBlue,'LineWidth', 2);

set(gca,'linewidth',2,'fontsize',18);

ymin = 0.98*min(totSig);

ymax = 1.02*max(totSig);

ylim([ymin ymax]);

fun = @(x,xx)x(1)*exp(-(xx-x(2)).^2/(2*x(3)^2))+x(4);

x0 = [10,scanLength/2.2,sigma*2,10]; % Random starting guess

x = lsqcurvefit(fun,x0,xx,totSig);

hold on

fity = x(1)*exp(-(xx-x(2)).^2/(2*x(3)^2))+x(4);

plot(xx,fity,'color','red','LineWidth', 2);

set(gca,'linewidth',2,'fontsize',14);

str1 = 'Scan ';

str2 = num2str(i,'% 4.0f');

strTot = [str1,str2];

hTextYpos = ymin+(ymax-ymin)*0.88;

hText = text(0.88*scanLength, hTextYpos, strTot, 'FontSize',18);

sigPkArray(i) = x(1);

sigPosArray(i) = x(2);

sigSigmaArray(i) = x(3);

bckArray(i) = x(4);

%hold on

subplot(4,5,[5])

plot(sigPkArray(1:i),'color','red','LineWidth', 2);

set(gca,'linewidth',2,'fontsize',14);

xlim([1 numScans]);

ylim([sigpk*0.5 sigpk*1.5]);

hText = text(numScans*0.8, sigpk*1.25, 'a_0', 'FontSize',14);

subplot(4,5,[10])

plot(sigPosArray(1:i),'color','red','LineWidth', 2);

set(gca,'linewidth',2,'fontsize',14);

xlim([1 numScans]);

ylim([sigPos*0.98 sigPos*1.02]);

hText = text(numScans*0.8, sigPos*1.01, 'a_1', 'FontSize',14);

subplot(4,5,[15])

plot(sigSigmaArray(1:i),'color','red','LineWidth', 2);

set(gca,'linewidth',2,'fontsize',14);

xlim([1 numScans]);

ylim([sigma*0.5 sigma*1.5]);

hText = text(numScans*0.8, sigma*1.25, 'a_2', 'FontSize',14);

subplot(4,5,[20])

plot(bckArray(1:i),'color','red','LineWidth', 2);

set(gca,'linewidth',2,'fontsize',14);

xlim([1 numScans]);

ylim([bckav*0.98 bckav*1.02]);

hText = text(numScans*0.8, bckav*1.01, 'a_3', 'FontSize',14);

% Store the frame

frame = getframe(gcf);

writeVideo(vid,frame);

end

% Output the movie as an mpg file

close(vid);