Calculate pixel values at increasing radius

ndvi_classes.m function could be used to calculate the number and percentage of pixels at increasing radius from a lake following certain criterion’s. The function was originally developed to count the number of pixels falling in specific NDVI classes around lakes but may be useful for different proxies and situations. The function use georeferenced tiff images as input. For details please refer to Aleman et al. (2013) or to the included help. The image used in the example can be downloaded here.

The function:

function [classe,classe_per]=ndvi_classes(ImageName,critere1,critere2)

% INPUT:  ImageName is the name of the geotiff image for imput
%         critere1 (and 2) criterion for classes evaluation
% 
% OUTPUT: classe: vector of NDVI classes at increasing radius from
%                 the lake center (number of pixel falling in class)
%         classe_per: Same as classe but in percentage of pixels
% EXAMPLE: Using the given Image 'classif_GBL_94.tif'
%{
        [classe classe_per]=ndvi_classes('classif_GBL_94.tif','>2','<4');
        %Plot the classe as a function of distance in km 
        %(1pixel=0.0301km, input 200 pixels when asked)
        plot((1:200)*0.0301,classe_per,'k-')
        ylabel('% pixels >2 and <4')
        xlabel('Distance from lake center (km)')
%}         
% Blarquez Olivier 2012
% blarquez@gmail.com

[Imge,dat] = geotiffread(ImageName);

imagesc(double(Imge))

select= input('Select point interactively? Y/N: ', 's');
if select=='Y'
title('Please double clic on lake center:')
p = impoint(gca,[]);
p = wait(p);
p=round(p);
elseif select=='N' 
valstring = input('Enter latitude and longitude: ', 's');
valparts = regexp(valstring, '[ ,]', 'split');
coords = str2double(valparts);
[~,p(2)]=min(abs(linspace(dat.Latlim(1),dat.Latlim(2),dat.RasterSize(1))-...
    coords(1)));
[~,p(1)]=min(abs(linspace(dat.Lonlim(1),dat.Lonlim(2),dat.RasterSize(2))-...
    coords(2)));
end

radius = input('Radius in pixels to be evaluated: ');
Imge(:,((p(1)+(radius)):end))=[];
Imge(:, 1:(p(1)-(radius)))=[];
Imge(((p(2)+(radius)):end),:)=[];
Imge(1:(p(2)-(radius)),:)=[];

n=length(Imge);

classe=zeros(radius,1);
classe_per=zeros(radius,1);
for r=1:radius
    warning('off','all')
imshow(Imge)
%imagesc(double(Imge))

hEllipse = imellipse(gca,[(n/2-(r)) n/2-(r) r*2 r*2]);
maskImage = hEllipse.createMask();
imshow(maskImage);

maskedImge = Imge .* cast(maskImage,class(Imge));
%imshow(maskedImge);
maskedImge(maskedImge==0)=NaN;
pixList=reshape(maskedImge,[],1);
pixList(isnan(pixList),:)=[];
 
classe(r,1)=length(pixList(eval(['pixList',critere1]) & ...
     eval(['pixList',critere2]),:));
classe_per(r,1)=classe(r,1)./length(pixList(:,1));
end
close all
    warning('on','all')
end

Paleofire reconstruction based on an ensemble-member strategy

Matlab codes and data associated with the manuscript: Blarquez O., M. P. Girardin, B. Leys, A. A. Ali, J. C. Aleman, Y. Bergeron and C. Carcaillet. 2013. Paleofire reconstruction based on an ensemble-member strategy applied to sedimentary charcoal. Geophysical Research Letters 40: 2667–2672, are available here.

Preprocessed data for Lac à la Pessière and Lago perso used in the paper also available:
PESSIERE.mat.zip
PERSO.mat.zip

Superposed Epoch Analysis (SEA)

SEA.m function for Superposed Epoch Analysis (SEA) with confidence intervals estimated using block bootstrap procedure, the method is freely inspired from Adams et al. (2003), for an example of using SEA in palaeoecology see Blarquez and Carcaillet (2010). For details please refer to included help.

Example:

Create a random time serie with noise, define some events and plot them along with the time series:

t=1:500;
d=2.5*sin(2*pi*t/100)+1.5*sin(2*pi*t/41)+1*sin(2*pi*t/21);
T=(d+2*randn(size(d))).';
figure()
plot(t,T,'g')
ev=[50,93,131,175,214,257,297,337,381,428,470].';
hold on
plot(ev,repmat(4,length(ev),1),'v')

Screen Shot 2014-02-09 at 11.49.50 AM

Then we perform a SEA using a time window of 20 years before and 20 years after each event. ‘nbboot’ argument is used to define the number of circular block bootsrtap replicates with an automatically calculated block length (‘b’ equal 0) following Adams et al. (2003) procedure.


[SEA_means,SEA_prctiles]=SEA(T,ev,20,20,'prctilesIN',[5,95],'nbboot',9999,'b',0)

Screen Shot 2014-02-09 at 11.54.30 AM

Proxy response to the randomly generated events appears significant at the 95% confidence levels during events occurrence (at a lag close to zero).

Paleofire frequencies

KDffreq.m function calculates palaeo-fire frequency using a Gaussian kernel and computes bootstrapped confidence intervals arround fire frequency. Require the date of fire events as input variable. Associated with this function analyst may use cvKD.mfunction to estimate optimal kernel bandwidth by max log likelihood. Here’s an example:

Generate some fire dates for the last 8000 years:

x=randi(8000,40,1);
plot(x,1,'+','col','red')
set(gca,'xdir','reverse')
xlabel('Time (cal yrs. BP)')

Screen Shot 2014-02-09 at 12.17.27 PM

Use the cvKD.m function to calculate the optimal bandwidth for the kernel:

cvKD(x)
ans = 724.3434

Then we estimate the long term fire frequency using the Gaussian kernel density procedure:

 [ffreq]=KDffreq(x,'up',0,'lo',8000,'bandwidth',700,'nbboot',100,'alpha',0.05 );
 

Screen Shot 2014-02-09 at 12.28.47 PM