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);