Gatan | AMETEKSkip to Main Content
No options found

Rotational average

DigitalMicrograph Script

Create a rotationally averaged image (demonstrate warp command).

Preview

/////////////////////////////////////////////////////////////////////
// (c) Gatan Inc.
/////////////////////////////////////////////////////////////////////
// This script performs rotational average of an image. An image is passed in. If a diffractogram, it 
// is packed complex as a result of FFT and data type is changed to real by means of modulus extraction. 
// Then the image dimension (hight and width) is found from the image. This information is used 
// to declare several intermediate images such as "dst", "line_projection", and "rotational_average"

// The image is displayed in cardinal coordinates, and needs to be transformed into polar coordinates. 
// The passed variable "sample" defines the number of segment of the 360 degree angular range. 
// The transformation of coordinates ("img" in cardinal, "dst" in polar) is realized by bilinear inter-
// polation (the use of warp function). Then line projection is easily calculated by adding up all
// the columns in "dst" (polar coordinates). The averaged line intensity is also normalized by the
// number of segment ("sample"). Finally this (1D) line profile is used to generate a (2D) image --
// "rotational_average" by using again the bilinear interpolation technique (the warp function). The
// last line is to display the rotational averaged image using the iradius intrinsic variable. 
/////////////////////////////////////////////////////////////////////
//	last modified 08-July-2014 BS (comments only)


/*	The Rotational_Average method performs the rotational averaging.
	It is passed a source image and the sampling density 
	i.e. the number of segments to split the full 360 degree
	angular range into.  It returns the rotationally averaged image */ 

image Rotational_Average(image img, number samples)
{
	// Define neccessary parameters and constants
	number pi = 3.1416
	number xscale, yscale, xsize, ysize
	number centerx, centery, halfMinor
	number scale = img.ImageGetDimensionScale(0)
	string unit = img.ImageGetDimensionUnitString(0)

	// Likewise, declare intermediate images
	image rotational_average, dst, line_projection
	
	// If the source image is complex, take the modulus						
	if ( img.ImageIsDataTypeComplex( ))
		img := modulus(img)

	// Get the dimension sizes, and determine half the smallest dimension 
	img.Get2dSize( xsize, ysize )
	halfMinor = min( xsize, ysize )/2

	// Find the centre of the image
	centerx = xsize / 2
	centery = ysize / 2

	// Convert the image to polar co-ordinates...
	dst := RealImage( "dst", 4, halfMinor, samples )
	dst = warp( img, icol*sin(irow*2*pi/samples) + \
			centerx, icol*cos(irow*2*pi/samples) + centery )

	// and create a line projection using the icol intrinsic variable, 
	// normalising with the sampling density
	line_projection := RealImage( "line projection", 4, halfMinor, 1 )
	line_projection = 0
	line_projection[icol,0] += dst
	line_projection /= samples

	// Create rotationally averaged image using the line-projection and the iradius intrinsic variable
	rotational_average := RealImage( "Rotational Average", 4, halfMinor * 2, halfMinor * 2 )
	rotational_average = warp( line_projection, iradius, 0 )
	rotational_average.ImageSetDimensionScale( 0, scale )
	rotational_average.ImageSetDimensionScale( 1, scale )
	rotational_average.ImageSetDimensionUnitString( 0, unit )
	rotational_average.ImageSetDimensionUnitString( 1, unit )

	// Finally, return the rotationally averaged image
	return rotational_average
}

//  Call the method using the front image and a sampling density of 256
//  Display the result  
ShowImage( Rotational_Average(GetFrontImage(), 256))