///////////////////////////////////////////////////////////////////// // (c) Gatan Inc. ///////////////////////////////////////////////////////////////////// // This script compute the histogram of the front most image. // It will initially use 100 bins for the histogram, but the // user can increase or decrease the number of bins using the // cursor UP and DOWN keys. ///////////////////////////////////////////////////////////////////// // last modified 08-July-2014 BS // This method update the histogram image hst to display the value range [minV,maxV] with nChannels bins. // If the hst image is not yet shown, it will display it next to the source image src. void UpdateHistogram( image src, image &hst, number nChannels, number minV, number maxV ) { // Verify that the source image src is valid. if ( !ImageIsValid(src) ) Throw( "Invalid input image source.") // Ensure minimum of 3 channels nChannels = ( nChannels < 3 ) ? 3 : nChannels // Check if histogram image exists, otherwise create and display if ( !ImageIsValid(hst) ) { hst := IntegerImage( "Histogram", 4, 0, nChannels ) // unsigned 4-byte integer numbers // Calibrate the X axis number origin = minV string unit = src.ImageGetIntensityUnitString() number scale = (maxV-minV)/nChannels hst.ImageSetDimensionCalibration(0, origin, scale, unit, 0 ) // Calibrate the intensity axis hst.ImageSetIntensityOrigin(0) hst.ImageSetIntensityScale(1) hst.ImageSetIntensityUnitString("#pixels") // Find display position of source image and display right of it // (Assumes that src is displayed!) number t,l,b,r src.ImageGetOrCreateImageDocument().ImageDocumentGetWindow().WindowGetFrameBounds(t,l,b,r) ShowImage(hst) hst.ImageGetOrCreateImageDocument().ImageDocumentGetWindow().WindowSetFramePosition(r,t) } // Update the histogram. // First resize to have the appropriate number of channels. // (This keeps the window in place. ) ImageResize( hst, 1, nChannels ) // Ensure the window displays all channels hst.ImageGetImageDisplay(0).LinePlotImageDisplaySetDisplayedChannels(0,nChannels) // Reset the histogram calibrations. (Image resize keeps the FOV!) hst.ImageSetDimensionScale( 0, (maxV-minV)/nChannels ) // Then recompute the histogram values ImageCalculateHistogram( src, hst, 0, minV, maxV ) } string msg msg += " to increase histogram channels\n" msg += " to decrease histogram channels\n" msg += " to end script" OKDialog(msg) image src := GetFrontImage() image hst number mi = min(src) number ma = max(src) number nChannels = 100 number key while(key != 27) // { UpdateHistogram( src, hst, nChannels, mi, ma ) key = GetKey() if ( 30 == key ) // { nChannels-- } else if ( 31 == key ) // { nChannels++ } else continue // iterate next loop, i.e. jump to begin of while() } DeleteImage(hst)