q60.py - python 3 tool to parse a scanned q60 image and compare to associated data file (e.g. R2200712.Q60) 
for that Q60 batch (see date code on front of q60 image).  It requires python3-numpy, python3-pillow, and
python3-matplotlib.
The resulting graphs show how closely averaged pixels in the squares match the q60 data file.

Note that currently the script can't auto-detect the placement of the squares, so the user must manually
tune the q60_image_info structure at the top of q60.py.  To figure out the current placement, run with 
the -t option and look at the thumbnails.  First the row*.tif files - the letters should be exactly
in the middle (as should the squares - you don't want to see the previous or next row of squares at all).
Then the [A-L]00_[rgb].tif files should give left/right placement once the rows are done.
No rotation is allowed at all - so be sure that the Q60 target is place completely squarely on the scan top.

For the output graphs:
gs - grayscale ramp
fleshtones - the squares under the face
cmykrgb - the cymk,rgb columns
AtoL are the A to L chroma colums

red stem plot is the values from the .Q60 file (the Target values)
green plot is the values measure from the patches (the Test values)

Everything is in Lab colorspace


A 20x20 area inside each square is sampled.  The actual full square is ~80x80, but we are trying to avoid sampling
nearby squares accidentally.

Example run:   python3 q60.py myq60_rgb.ppm R2200703.Q60
That run assumes my scanned output was in myq60_rgb.ppm, and the Q60 was labelled as
R2 200703
