// ContrastEnhancement // // last modified 10-Sept-2002 RTH // // Interactively emphasizes or de-emphasizes // the background or details in an image. // Presently works with real and integer // images of almost any size. // // For DM 3.3.1 or higher only! // // image test, front, large, final, backgroundImage, detailedImage, IncDetailedImage, final2 complexImage testC number imageDataTypeIs, version, backup number top, left, bottom, right, posX, posY, aver, sizeX, sizeY number weight, j, i, aver2, mittel, mini, zoom, key, screenX, screenY, ii, inc number scaleX, scaleY, calibrate number uparrow, downarrow, leftarrow, rightarrow, DMversion string pixelsizeunit, Neg_Val, platform, IsActiveSelection, ApplyToFullImage // // Solve version issues: // GetPersistentNumberNote("Private:Configuration:ApplicationVersion", DMversion) if( DMVersion <= 330 ) Throw("Needs DigitalMicrograph version 3.3.1 or higher") uparrow = 30; downarrow = 31; leftarrow = 28; rightarrow = 29; // // Put up info window // OkDialog("Press space bar to stop script at any time." + \ "\n\n(For additional info see \nResults- and Progress- windows)") // // Determine type of front Image // // Check on front Image: only for real/integer images // test := GetFrontImage() try mini = min(test) catch Throw("Only for real or integer images.") // // Getting data from original image // zoom = GetZoom(test) GetScale( test, scaleX, scaleY) pixelSizeUnit = GetUnitString( test ) if(pixelSizeUnit != "") { calibrate = 1 Result(" (calibrated)") } GetSize( test, sizeX, sizeY ) GetWindowPosition( test, posX, posY ) GetSelection( test, top, left, bottom, right ) if(sizeX != (right - left) || sizeY != (bottom-top)) IsActiveSelection = "yes" // // Create backup image for integer images (keeps original image untouched) // if( !IsFloatImage( test ) ) { front := test + 0 HideImage(test) setZoom(front, zoom) DisplayAt(front, posX, posY) SetSelection( front, top, left, bottom, right ) updateImage(front) backup = 1 } else front := test // just changing name .... OpenResultsWindow() Result("\n\nEdi'sContrastEnh: " + datestamp() + "\n") Result( " image: " + GetName( test ) + "\n") // // Check for negative values in image // mini = min( front ) if( mini < 0 ) { if( !OkCancelDialog( "negative values found in image." + \ "\n\n Continue anyway ?" ) ) { CloseProgressWindow() Result("Edie's Contrast Enhancement aborted\n\n") if(backup == 1) { DeleteImage(front) ShowImage(test) } Throw(-128) } Result(" (!) negative values found in image ..... continued \n") Neg_Val = "found" } // // number of pixels to be averaged over? (will be an odd number) // aver = 9 if( !GetNumber( " Number of pixels to average? ( >2 ) !\n integers only, please!\n \n (be patient)", aver, aver) ) { CloseProgressWindow() Result("Edie's Contrast Enhancement aborted\n\n") if(backup == 1) { DeleteImage(front) ShowImage(test) } Throw(-128) } aver = 2 * (Round( Abs(aver) / 2 - 0.5 ) + 0.5 ) -1 Result(" averaging over an area of " + (aver + 1) + " x " + (aver + 1) + " pixels ") // // create larger image with frame set to the average image edge values: // large := CreateFloatImage( "", (right-left) + aver, (bottom-top) + aver) large[ aver/2, aver/2, (bottom-top) + aver/2, (right-left) + aver/2 ] \ = front[top, left, bottom, right] ii = 0 // left rows while( ii < aver/2 ) { large[aver/2, ii, (bottom-top)+aver/2, ii+1] = front[top, left, bottom, left+1] ii += 1 } ii = 0 // right rows while( ii < aver/2 ) { large[aver/2, (right-left) + aver/2 + ii, (bottom-top)+aver/2, (right-left) + aver/2 + ii+1] = \ front[top, right-1, bottom, right] ii += 1 } ii = 0 // top rows while( ii < aver/2 ) { large[ii, aver/2, ii + 1, (right-left) + aver/2] = front[top, left, top+1, right] ii += 1 } ii = 0 // lower rows while( ii < aver/2 ) { large[(bottom-top) + aver/2 + ii, aver/2, (bottom-top) + aver/2 + ii + 1, (right-left) + aver/2] = \ front[bottom - 1, left, bottom, right] ii += 1 } // The corners: large[0, 0, aver/2, aver/2] = average( front[top, left, top + aver/2, left + aver/2] ) large[aver/2 + (bottom-top), 0, aver + (bottom-top), aver/2] = \ average(front[bottom - aver/2, left, bottom, left + aver/2]) large[aver/2 + (bottom-top), aver/2 + (right-left), aver + (bottom-top), aver + (right-left)] = \ average(front[bottom - aver/2, right - aver/2, bottom, right]) large[0, aver/2 + (right-left), aver/2, aver + (right-left)] = \ average(front[top, right - aver/2, top + aver/2, right]) // // create new image (backgroundImage) in which the shifted images are added: // backgroundImage := CreateFloatImage( GetName(test) + "Aver", (right-left), (bottom-top) ) backgroundImage = 0 ii = 0 j = - aver/2 i = - aver/2 OpenAndSetProgressWindow( "Creating", "large area contrast", "image part " + \ (aver/2 + j + 1) + " of " + (aver + 1) ) while(j <= aver/2 ) { OpenAndSetProgressWindow( "Creating", "large area contrast", "image part " + \ (aver/2 + j + 1) + " of " + (aver + 1) ) while(i <= aver/2 ) { if( i*i + j*j > aver*aver/4 ) { i += 1 } else { backgroundImage = backgroundImage + \ large[aver/2 + j, aver/2 + i, (bottom-top) + aver/2 + j, (right-left) + aver/2 + i] i += 1 ii += 1 } } i = - aver/2 j = j + 1 Result(".") } Result("\n") backgroundImage = backgroundImage / ii OpenAndSetProgressWindow( "Creating", "detailed image", "..." ) DeleteImage( large ) // // divide original image by "average" to get detailed image (detailedImage). // detailedImage = ( front[ top, left, bottom, right ] / backgroundImage ) *\ average( backgroundImage ) // // // This is the loop for adding the averaged image with the // detailed and weighted image, with interactive weighting factor. // // key = 0 weight = 3 inc = 1 final := CreateFloatImage( "final", (right-left), (bottom-top)) IncDetailedImage = detailedImage * inc final = backgroundImage + weight * DetailedImage SetName( final, GetName(test) + ".Ed") SetZoom( final, zoom ) DisplayAt( final, posX, posY) updateImage( final ) OpenAndSetProgressWindow("average image + ","" + weight + " * detailed image", "inc = " + inc) Result(" up / down -> change contrast\n") Result(" left/right -> adjust increment\n") Result(" space bar -> stop process\n") while( key != 32 && key != 13 && key != 3) { key = GetKey() if(key == 0) DoEvents() else if( key == uparrow ) { if(weight + inc < 100) { weight = Round(10000*(weight + inc))/10000 OpenAndSetProgressWindow("average image + ","" + weight + " * detailed image", "inc = " + inc) final += IncDetailedImage } } else if( key == downarrow ) { if(weight - inc >= 0.0) { weight = Round(10000*(weight - inc))/10000 if( Abs(weight) < 0.00001 ) weight = 0.0 OpenAndSetProgressWindow("average image + ","" + weight + " * detailed image", "inc = " + inc) final += -IncDetailedImage } if(weight - inc < 0 && inc != 0.01) { if(inc == 5) inc = 2 else if(inc == 2) inc = 1 else if(inc == 1) inc = 0.5 else if(inc == 0.5) inc = 0.2 else if(inc == 0.2) inc = 0.1 else if(inc == 0.1) inc = 0.05 else if(inc == 0.05) inc = 0.02 else if(inc == 0.02) inc = 0.01 OpenAndSetProgressWindow(""," Wait !!", "") IncDetailedImage = DetailedImage * inc OpenAndSetProgressWindow("average image + ","" + weight + " * detailed image", "inc = " + inc) } } else if( key == leftarrow ) { if(inc > 0.01) { if(inc == 5) inc = 2 else if(inc == 2) inc = 1 else if(inc == 1) inc = 0.5 else if(inc == 0.5) inc = 0.2 else if(inc == 0.2) inc = 0.1 else if(inc == 0.1) inc = 0.05 else if(inc == 0.05) inc = 0.02 else if(inc == 0.02) inc = 0.01 OpenAndSetProgressWindow(""," Wait !!", "") IncDetailedImage = DetailedImage * inc OpenAndSetProgressWindow("average image + ","" + weight + " * detailed image", "inc = " + inc) } } else if( key == rightarrow ) { if(inc < 5) { if(inc == 0.01) inc = 0.02 else if(inc == 0.02) inc = 0.05 else if(inc == 0.05) inc = 0.1 else if(inc == 0.1) inc = 0.2 else if(inc == 0.2) inc = 0.5 else if(inc == 0.5) inc = 1 if(inc == 1) inc = 2 if(inc == 2) inc = 5 OpenAndSetProgressWindow(""," Wait !!", "") IncDetailedImage = DetailedImage * inc OpenAndSetProgressWindow("average image + ","" + weight + " * detailed image", "inc = " + inc) } } else if( key != 32 && key != 13 && key != 3) OkDialog("Please press space bar to end current task") } CloseProgressWindow() zoom = GetZoom(final) if(zoom > 1) { SetZoom(final, 1) SetWindowSize(final, (right-left), (bottom-top)) } SetName( final, GetName(front) + ".Ed") SetScale( final, scaleX, scaleY) SetUnitString( final, pixelsizeunit) // // Finishing off: case 1: No selection // if( IsActiveSelection == "" ) { SetName( final, GetName(test) + ".Ed") Result(" final filter: background image + " + weight + " * detailed image" + "\n") if(backup == 1) { DeleteImage(front) ShowImage(test) showImage(final) } Result(" output: " + GetName( test ) + ".Ed" + "\n") Result(" done " + DateStamp() + "\n") Throw(-128) } // // Finishing off: case 2: active selection // if( IsActiveSelection == "yes" ) { SetName( final, GetName(test) + ".s.Ed") Result(" output: " + GetName( test ) + ".s.Ed" + "\n") if(TwoButtonDialog("Apply filter to full image too?","YES","no")) ApplyToFullImage = "yes" else { Result(" final filter: background image + " + weight + " * detailed image" + "\n") if(backup == 1) { DeleteImage(front) ShowImage(test) showImage(final) } Result(" output: " + GetName( test ) + ".Ed" + "\n") Result(" done " + DateStamp() + "\n") Throw(-128) } } if( ApplyToFullImage == "yes" ) { // create larger image with frame set to the average image edge values: large := CreateFloatImage( "", sizeX + aver, sizeY + aver) large[ aver/2, aver/2, sizeY + aver/2, sizeX + aver/2 ] \ = front[0,0, sizeY, sizeX] ii = 0 // left rows while( ii < aver/2 ) { large[aver/2, ii, sizeY+aver/2, ii+1] = front[0, 0, sizeY, 1] ii += 1 } ii = 0 // right rows while( ii < aver/2 ) { large[aver/2, sizeX + aver/2 + ii, sizeY + aver/2, sizeX + aver/2 + ii + 1] = \ front[0, sizeX-1, sizeY, sizeX] ii += 1 } ii = 0 // top rows while( ii < aver/2 ) { large[ii, aver/2, ii + 1, sizeX + aver/2] = front[0, 0, 1, sizeX] ii += 1 } ii = 0 // lower rows while( ii < aver/2 ) { large[sizeY + aver/2 + ii, aver/2, sizeY + aver/2 + ii + 1, sizeX + aver/2] = \ front[sizeY - 1, 0, sizeY, sizeX] ii += 1 } // The corners: large[0, 0, aver/2, aver/2] = average( front[0, 0, aver/2, aver/2] ) large[aver/2 + sizeY, 0, aver + sizeY, aver/2] = \ average(front[sizeY - aver/2, 0, sizeY, aver/2]) large[aver/2 + sizeY, aver/2 + sizeX, aver + sizeY, aver + sizeX] = \ average(front[sizeY - aver/2, sizeX - aver/2, sizeY, sizeX]) large[0, aver/2 + sizeX, aver/2, aver + sizeX] = \ average(front[0, sizeX - aver/2, aver/2, sizeX]) // create new image (backgroundImage) in which the shifted images are added: backgroundImage := CreateFloatImage( GetName(test) + "Aver", sizeX, sizeY ) backgroundImage = 0 ii = 0 j = - aver/2 i = - aver/2 OpenAndSetProgressWindow( "Creating", "large area contrast", "image part " + \ (aver/2 + j + 1) + " of " + (aver + 1) ) while(j <= aver/2 ) { OpenAndSetProgressWindow( "Creating", "large area contrast", "image part " + \ (aver/2 + j + 1) + " of " + (aver + 1) ) while(i <= aver/2 ) { if( i*i + j*j > aver*aver/4 ) { i += 1 } else { backgroundImage = backgroundImage + \ large[aver/2 + j, aver/2 + i, sizeY + aver/2 + j, sizeX + aver/2 + i] i += 1 ii += 1 } } i = - aver/2 j = j + 1 } backgroundImage = backgroundImage / ii OpenAndSetProgressWindow( "Creating", "detailed image", "..." ) DeleteImage( large ) detailedImage := ( front[ 0, 0, sizeY, sizeX ] / backgroundImage ) *\ average( backgroundImage ) final2 := backgroundImage + weight * DetailedImage SetName( final2, GetName(test) + ".Ed") ShowImage(final2) } if(backup == 1) { DeleteImage(front) ShowImage(test) showImage(final2) showImage(final) } Result(" output: " + GetName( test ) + ".Ed" + "\n") Result(" done " + DateStamp() + "\n") CloseProgressWindow()