Scripting Resources for DigitalMicrograph™ 
Function: Find the Centre of Gravity 

Function 
Returns the coordinates of the centre of gravity of the passed in image 
Version 
version:20150807, v1.0 
Author 
D. R. G. Mitchell 
Acknowledgements 
 
Comments 
Pass in an image to the function and the coordinates of its centre of gravity will be returned. 
System Requirements 
Tested on GMS 2.x but should be compatible with all versions of GMS. 
Known Issues 
 
Supported 
Yes 
Included Files 
Main script file. 
Source Code 
// Function to find the centre of gravity of the passed in image. Cogx and cogy are passed in by reference and // report the coordinates of the centre // D. R. G. Mitchell, adminnospam@dmscripting.com (remove the no spam to make this address work)
// Function to find the centre of gravity of the passed in image (central roi). The coordinates of the centre are returned
void findcentreofgravity(image centralroi, number &cogx, number &cogy) { // For information on this calculation see John Russ  Image Processing Handbook, 2nd Ed. p489
number xpos, ypos, maxval, imgsum, xsize, ysize, i image tempimg
maxval=max(centralroi, xpos, ypos) imgsum=sum(centralroi)
getsize(centralroi, xsize, ysize)
// Traps for a blank image
if(imgsum==0) // the image is blank so set the CoGs to the centre of the image and return { cogx=(xsize1)/2 //minus one since the centre of a 2 x 2 image is 0.5,0.5  0,0 is a position cogy=(ysize1)/2 //minus one since the centre of a 2 x 2 image is 0.5,0.5  0,0 is a position return }
// Collapse the image down onto the x axis
image xproj=realimage("",4,xsize,1) xproj[icol,0]+=centralroi
// Rotate the passed in image through 90 degs so that rows become columns // Then collapse that image down onto the x axis (was the y axis)
tempimg=realimage("", 4, ysize, xsize) tempimg=centralroi[irow,icol] image yproj=realimage("",4,ysize, 1) yproj[icol,0]+=tempimg
yproj=yproj*(icol+1) // NB the +1 ensures that for the left column and top row, where xproj=xproj*(icol+1) // icol=0 are included in the weighting. 1 must be subtracted from // the final position to compensate for this shift cogx=sum(xproj) cogy=sum(yproj) cogx=(cogx/imgsum)1 // compensation for the above +1 to deal with icol=0 cogy=(cogy/imgsum)1 }
// Main script  have an image frontmost which contains some kind of blob or feature, which you // wish to locate the centre of gravity of
image temp:=getfrontimage() number cogx, cogy findcentreofgravity(temp, cogx,cogy) result("\nCog x="+cogx+" cogy="+cogy) 