Reports

Contents

Title: EE Picam Intercomparison
Date:2024-05-02 - 2024-08-28
Data File: newEEpicam_2024.csv
oldEEpicam_2024.csv
Refers to:EE, sn RPI0W-005, sn RPI0W-006

Picam sn RPI0W-005 ("old picam") and sn RPI0W-006 ("new picam") were compared at East End over 4 months.

We had noticed that the photos from sn RPI0W-005 were looking washed out. We observed that the East End canopy was getting taller through the years and reaching the same height as the "old picam" sn RPI0W-005, which was attached to the upper level of the scaffolding, so we wanted to install another camera that was higher up on the tower.

On 2024-05-01, we installed the "new picam" sn RPI0W-006 on the 7500 mount, maybe 50cm higher than the "old picam."

Since 2024-05-01, EE_cam data in database is from the "new picam" sn RPI0W-006.

2018 and 2023 photos from EE show the massive increase in canopy height

Figure 1. 2018 and 2023 photos of the East End tower show the dramatic increase in canopy height.

 

Picam intercomparison May-August 2024

Figure 2. Comparison of photos from the first of each month, May through August. "Old" picam photos in the left column and "new" picam photos in the right column. Each photo is from 12:45 PST. Near the end of the growing season, the canopy is at the same height as the "old" picam.

When the canopy is closer to the camera, we see more of the flat side of the leaf (the face of the leaf) as opposed to the edges of the leaf. I think this makes the photo more bright and green, so the GCC value was higher overall because the color of the leaf face is lighter then the leaf edge. We also see fewer leaves in general when the canopy is close to the camera.

 

Timeseries of GCC

Figure 3. Time series of GCC values from each picam, with each symbol representing one photo. There are 5 photos from each day: 11:15, 11:45, 12:15, 12:45, and 13:15 PST. At the start of the comparison period, the GCC from both cameras is very similar, but they get more different as time passes. The "old" picam has a slightly higher GCC than the "new" picam by mid-August.

Timeseries of GCC with 10-day moving mean plotted

Figure 4. Time series of GCC from both picams. The 5 values from each day were averaged, and the daily average was used to calculate the 10-day running mean (bold line). Here we see the running means started deviating from each other by the end of July.

17278237954957.png

Figure 5. Scatter plot of GCC from each camera. The symbols are colored based on the DOY (see colorbar on the right axis). The relationship is very linear until about DOY 210 (July 28th). Joe thinks this is because as the canopy grew taller, the view angle of the cameras changed.

Conclusion: Camera's view angle does impact our calculated GCC.

Joe says: "This is what I would expect to see. The old camera is lower and is looking more sideways at the plants - it should green up faster, saturate earlier and stay saturated longer. The new camera is looking down on the vegetation so it sees more of the dead litter peaking through. Also a good lesson that even just a meter difference in the height of the camera could have more influence on the data than other things." 

 

Timeseries of EE GCC since 2019-06-01

Figure 5. Timeseries of of GCC data from EE_cam starting June 2019. The camera changed twice during this period, Jul 2020 (Stardot to "old picam") and May 2024 ("old picam" to "new picam"). Interesting that the summer peak in 2023-2024 are lower than summer peaks 2021-2022, although it was the one picam 2021-2023 and a different picam in 2024. Maybe the litter building up over the years is decreasing the max summer GCC.

2020-07-21: "Old picam" sn RPI0W-005 installed to replace stolen Stardot camera

2024-05-01: "New picam" sn RPI0W-006 installed

 

---------------------------------Code ---------------------------------

%% PicamIntercompare.m
% This script loads GCC files from two different picams, calculates their
% midday averages, and plots them in a timeseries and in a regression. This
% script was used for the picam intercomparison at East End over summer
% 2024.

clear variables;
close all;

% Load Inputs ************************************************************

%load GCC output file from matlab
old=csv2table('oldEEpicam.csv');
old.GCC=old.Grn./(old.Red+old.Grn+old.Blu);
t_old=datenum(old.year,1,old.doy,floor(old.time/100),mod(old.time,100),0);
dt_old=datetime(t_old,'convertfrom','datenum');
%find midday data 11:15-13:15
x=find(hour(dt_old)>=11 & hour(dt_old)<=12);
y=find(hour(dt_old)==13 & minute(dt_old)==15);
imid=[x;y];imid=sort(imid);
%define midday GCC and time vectors
old_midday=old.GCC(imid);
t_old_midday=t_old(imid);
dt_old_midday=datetime(t_old_midday,'convertfrom','datenum');

%load GCC outputfile from matlab
new=csv2table('newEEpicam.csv');
new.GCC=new.Grn./(new.Red+new.Grn+new.Blu);
t_new=datenum(new.year,1,new.doy,floor(new.time/100),mod(new.time,100),0);
dt_new=datetime(t_new,'convertfrom','datenum');
%find midday data 11:15-13:15
x=find(hour(dt_new)>=11 & hour(dt_new)<=12);
y=find(hour(dt_new)==13 & minute(dt_new)==15);
imid=[x;y];imid=sort(imid);
%define midday GCC and time vectors
new_midday=new.GCC(imid);
t_new_midday=t_new(imid);
dt_new_midday=datetime(t_new_midday,'convertfrom','datenum');

% Calculate Daily Average *************************************************

[old_avg,old_day]=dailyMean(old_midday,t_old_midday);
[new_avg,new_day]=dailyMean(new_midday,t_new_midday);

% [old_mdn,~]=dailyMedian(old_midday,t_old_midday);
% [new_mdn,~]=dailyMedian(new_midday,t_new_midday);

dt_old_day=datetime(old_day,'convertfrom','datenum');
dt_new_day=datetime(new_day,'convertfrom','datenum');

% Plot ********************************************************************
figure();
plot(dt_old_midday,old_midday,'r*');
hold on;
plot(dt_new_midday,new_midday,'b*');
title('EE picam, 11:15-13:15')
ylabel('GCC')
legend('old picam','new picam','location','best')

figure();
plot(dt_old_midday,old_midday,'r*');
hold on;
plot(dt_new_midday,new_midday,'b*');
plot(dt_old_day,old_avg, 'r-');
plot(dt_new_day,new_avg,'b-');
title('EE daily mean, 11:15-13:15')
ylabel('GCC')
legend('old picam', 'new picam', 'old median', 'new median','location','best');

new_avg10=movmean(new_avg,10);
old_avg10=movmean(old_avg,10);

figure();
plot(dt_old_midday,old_midday,'r*');
hold on;
plot(dt_new_midday,new_midday,'b*');
plot(dt_old_day,old_avg10,'k-','linewidth',2);
plot(dt_new_day,new_avg10,'y-','linewidth',2);
title('EE daily mean, 11:15-13:15, 10day movmean')
ylabel('GCC')
legend('old picam','new picam','old movmean','new movmean','location','best');

% Find intersection of both datasets to plot regression
%[C,ia,ib] = intersect(a,b)
% C = A(ia) and C = B(ib)

[t_int,i_new,i_old]=intersect(new_day,old_day);
dt=datetime(t_int,'convertfrom','datenum');
dy=day(dt,'dayofyear')';

figure();
scatter(new_avg10(i_new),old_avg10(i_old),[],dy,'filled');
c=colorbar;c.Label.String='DOY';
xlabel('GCC from new picam')
ylabel('GCC from old picam')
title('EE picam intercomparison, 10day movmean 11:15-13:15')