If you have access to Matlab, it is quite easy to process an image, identify geometric objects like circular features, find the feature centers and evaluate the area for color, etc.
A well aligned photo taken from directly overhead would reduce distortion, which is not required but might help.
Below is a random example. I it wrote some years ago, to evaluate the emission color ratio of fluorescent bacterial colonies on plate, starting from two images of the same plate, taken using blue and green filters.
Matlab's documentation includes countless examples, so it is pretty easy to get up to speed with arcane function names.
ImageJ from the NIH does a lot of this same stuff, but with a completely different user interface, and is free/open source.
clear all; close all;
% read in blue and subtract background
disp('Select blue image');
[blueframe, pathname]=uigetfile('*.jpg','Select an image file');
s=sprintf('File selected: %s ',blueframe); disp(s);
I0b = imread(blueframe);
I0b = I0b(:,:,1);
% calculate background by wiping out disks smaller than 35 pixel radius
bg = imopen(I0b,strel('disk',35));
i0b=I0b-bg;
% scale to maximize contrast
imadjust(i0b);
imshow(i0b); title(blueframe);
%read in green and subtract background
disp('Select green image');
[greenframe, pathname]=uigetfile('*.jpg','Select an image file');
s=sprintf('File selected: %s ',greenframe); disp(s);
I0g = imread(greenframe);
I0g = I0g(:,:,1);
bg = imopen(I0g,strel('disk',35));
i0g=I0g-bg;
imadjust(i0g);
%sum the two images and find colonies
sumI=imadjust(i0b+i0g);
level=graythresh(sumI);
bw=im2bw(sumI,level);
% find blobs with > 500 pixels
bw=bwareaopen(bw,500);
%find connected regions and label them in array "labels"
[labels, NumObjects]=bwlabel(bw);
% sum up intensities in each of the labeled blobs, on each image
for j=1:NumObjects
indices=find(labels==j);
blue(j)=sum(i0b(indices));
green(j) = sum(i0g(indices));
end
% calculate ratio of green to blue for each blob
ratio=[green] ./ [blue];
% generate zero image of the same size
img=zeros(size(bw));
% fill in blob areas with appropriate ratio values
for j=1:NumObjects
indices = find(labels==j);
img(indices)=ratio(j);
end
colormap(jet);
image(img,'CDataMapping','scaled'); title(blueframe);








