I have time series digital camera photographs of rice cultivation throughout the season. I need to extract the greenness (relate to rice plant chlorophyll content) from images. Can you tell me a method or way to do this?
Try to extract the RGB channels of the image (you can do it using R and EBImage library and the function channel); then recompute the channels as follows:
r= R/(R+G+B), g= G/(R+G+B), b=B/(R+G+B); this pre-processing is useful to remove scene illumination influences;
the final step is to calculate features representing greenness as follows:
Grenness=2G-R-B
or
Grenness=2G+B-2R
Both methods are able to isolate Green tissues from residue/soil background.
You may use a professional (still free !) software package called CAN-EYE developed by INRA Avignon (France): http://www6.paca.inra.fr/can-eye. You can retrieve the green Leaf Area Index, and not the plant chlorophyll content.
@James Peters : just evaluating the G channel is not enough. White areas (e.g. sandy beaches) also have high values in G, so I would add as criterion that besides G being high, the R and B should be low enough.
I developed a method which allows you to estimate chlorophyll at leaf level using a commercial RGB camera. The method is explained in a poster which you can download at the URL here below:
Mind that this method has been developed for leaf level measurements, not for canopies. However you can perform up-scaling of chlorophyll to (rice) canopy level by measuring a sufficiently large set of rice plant leaves and subsequently apply a canopy model using an erectophile leaf distribution (for rice plants). Give it a try, I think for homogeneous canopies like with rice plants it should work out fine.
Cheers,
Frank
PS.: You need a leaf and canopy model (is explained in the poster) to make your method specific for rice plant canopies. If you want I can provide the models which I used for this purpose.to determine the chlorophyll content of Tilia leaves and trees.
I would also suggest some indices for green extraction that you can find in these articles:
Meyer, G.E. & Neto, J.C. 2008, "Verification of color vegetation indices for automated crop imaging applications", Computers and Electronics in Agriculture, vol. 63, no. 2, pp. 282-293.
Casadesus et al. 2007 Using vegetation indices derived from conventional digital camera as selection criteria for wheat breeding in water-limited environments. Annals of Applied Biology 150, pp. 227–236
Try to extract the RGB channels of the image (you can do it using R and EBImage library and the function channel); then recompute the channels as follows:
r= R/(R+G+B), g= G/(R+G+B), b=B/(R+G+B); this pre-processing is useful to remove scene illumination influences;
the final step is to calculate features representing greenness as follows:
Grenness=2G-R-B
or
Grenness=2G+B-2R
Both methods are able to isolate Green tissues from residue/soil background.
@Francesco Chianucci: following up on your suggestions, I found better results using the hue saturation value (hsv) colour space instead of the rgb colour space. Here are the steps:
1. convert an rgb image to an hsv image.
2. obtain almost pure hsv values for each colour using your first suggestion.
@Francesco Chianucci: following your first suggestion using only the rgb colour space, I used the following Matlab script to obtain pure channel images:
subplot(2,3,6); imagesc(g1b);title('rgb blue channel');
The results produced by this script are shown in the attached image. The deep red segments, for each channel, exhibit the pure colour channel brightness values.
@Francesco Chianucci: following your second suggestion using only the rgb colour space, I used the following Matlab script to obtain less satisfactory results:
% rgb to pure colour segments (method 2)
clc, clear all, close all, whitebg('w')
g1 = imread('peppers.png');
%
g1r = g1(:,:,1)./(g1(:,:,1)+g1(:,:,2)+g1(:,:,3));
g1g = g1(:,:,2)./(g1(:,:,1)+g1(:,:,2)+g1(:,:,3));
g1b = g1(:,:,3)./(g1(:,:,1)+g1(:,:,2)+g1(:,:,3));
g = 2.*g1r-g1g-g1b; r = 2.*g1g-g1r-g1b; b = 2.*g1b-g1g-g1r;
subplot(2,3,6); imagesc(b);title('rgb blue channel');
You can see from the attached image that the red and blue channel displays contain impurities. However, the green channel results are remarkable, since the pure green channel values are illuminated with only minor red impurities (the blue channel display can be ignored).