///////////////////////////////////////////////////////////////////// // (c) Gatan Inc. ///////////////////////////////////////////////////////////////////// // This script performs data scaling of a 2D image. // Pixels are either sampled/repeated or bi-linearly interpolated. ////////////////////////////////////////////////////////////////////// // last modified 08-August-2014 BS image img if ( !GetFrontImage( img ) ) exit(0) // Exit script if no front-image found if ( 2 != ImageGetNumDimensions( img ) ) exit(0) // Exit script if the image is not 2D // Ask user to provide a scale factor. // Refuse entries which are <=0. // Exit script if user clicks the cancel button. number scale=0 while( (0>=scale) ) { if ( !GetNumber("Enter scale factor as positive number.", scale, scale) ) exit(0) } // Ask user if data should be interpolated number interpolate = TwoButtonDialog( "Should the data be...", "interpolated", "sampled" ) // Create identical copy of input image, including tags, calibration etc... image dst := ImageClone(img) ShowImage(dst) // Resize image to given dimension. // This command keeps the field of view (FOV) the same, i.e. adjusted spatial calibrations // while it adjusts the pixel-dimensions of the image. // However, the actual data is set to zero-value. number width,height GetSize( img, width, height ) ImageResize( dst, 2, width*scale, height*scale ) // Now either use sampling (i.e. nearest neighbour interpolation) // or bilinear interpolation // to fill the data container if ( interpolate ) { SetName( dst, GetName(dst) + " (bilinear)") dst = warp( img, icol/scale, irow/scale ) // Warp interpolates the value at img[X,Y] based on the 4 nearest integer coordinates. // Hence for X = icol/scale and Y = irow/scale it will perform bilinear interpolation // if X/Y is not an integer value. icol/irow run over the dimensionality of the image 'dst'. } else { SetName( dst, GetName(dst) + " (sampling)") dst = img[ icol/scale, irow/scale ] // Direct coordinate addressing at img[X,Y] will truncate the coordinates X/Y to integer // values. // Hence for X = icol/scale and Y = irow/scale data is simply sampled/repeated at truncated // value. // For a "nearest neighbor" sampling one could simply use // dst = img[ round(icol/scale), round(irow/scale) ] // to replaces truncation by value-rounding. }