Crystal
DigitalMicrograph Script
Produce an image resembling a noisy TEM image of a crystal with x-rays.
Preview
/////////////////////////////////////////////////////////////////////
// (c) Gatan Inc.
/////////////////////////////////////////////////////////////////////
// This script simulates a noisy TEM image of a crystal with X-rays.
// A dialog box will ask for the signal-to-noise ratio and the approximate number
// of X-rays you want to appear. You may enter "0" for the number of X-rays, in which
// case no X-rays are added to the image.
// It demonstrates use of the icol and irow intrinsic variables, and additionally
// use of the Random function
//////////////////////////////////////////////////////////////////////
// last modified 08-July-2014 BS
// Set up the x and y lattice spacings in pixels
number pi = 3.1415926, spacingX = 20, spacingY = 35
// The background scales the overall intensity, and the contrast
// determines the relative intensity of the pattern
number background = 200, contrast = 0.1
// This section asks the user for a number of factors
// including image dimensions, SNR and number of x-rays
// The number of x-rays is used as a probability and not as an absolute number.
number width, height, SNR, xRays
GetNumber("Enter image width:", 256, width)
GetNumber("Enter image height:", width, height)
GetNumber("Enter signal-to-noise ratio:", 1, SNR)
GetNumber("Enter number of X-rays:", 0, xRays)
// Create the destination image; real 4byte with 2 dimensions.
image crystal := RealImage("Simulated Crystal", 4, width, height)
// Generate the crystal image, scaled with respect to the background signal
// with a random noise component added
// Note Random Returns a random number in the range 0 to 65535.
crystal = background*(1 + contrast*( sin(2*pi*icol/SpacingX) \
*sin(2*pi*irow/spacingY) + Random()/(SNR*65536)))
// Add the number of specified x-rays; this conditional argument says that \
//if the random number generated is less than the value xrays/(width*height),
//then add 2000 to that pixel. If not, leave it as is. Note it acts on all pixels/
crystal += (Random() < xRays/(width*height)) ? 2000 : 0
// Set image contrast survey mode to 'entire image', and display the image
// Hence display limits will be set to [min,max] of the image, emphasizing x-rays.
SetSurveyTechnique(crystal, 1)
ShowImage(crystal)