Gatan | AMETEKSkip to Main Content
No options found

RGB color stack

DigitalMicrograph Script

Generates a 3D RGB image with each slice (wavelength image) colored according to its wavelength to match visible light. Each slice is normalized to itself.

Preview

// $BACKGROUND$

image dataset := GetFrontImage()
number roff,goff,boff
number wavelength 

roff = 1
goff = .5
boff = .2

Number Nx = ImageGetDimensionSize(dataset, 0)
Number Ny = ImageGetDimensionSize(dataset, 1)
Number Nz = ImageGetDimensionSize(dataset, 2)
//Result("\n number of slices: " + Nz )

image NewData := RGBimage("data",4, Nx, Ny, Nz)
image rawimage := Realimage("grayframe",4, Nx, Ny)
image newimage := RGBimage("singleframe",4, Nx, Ny, 1)
number Scale = dataset.ImageGetDimensionScale(2)
number Origin = dataset.ImageGetDimensionOrigin(2)
string Unit = dataset.ImageGetDimensionUnitString(2)
number Scaledeg = dataset.ImageGetDimensionScale(1)
number Origindeg = dataset.ImageGetDimensionOrigin(1)
string Unitdeg = dataset.ImageGetDimensionUnitString(1)
number sliceTowavelength(number plane, image data)
{

	wavelength = Scale*plane + Origin
	return wavelength
	
}


number gamma = 0.8 // display adjustment for monitor type
number attenuation = 1

 
number j
for (j=0; j<Nz; j++)

{




	wavelength = sliceToWavelength(j,dataset)

	If (wavelength < 360)
	{
	roff = 1
	goff = 1.0 
	boff = 1
	
	rawimage = Slice2(dataset, 0, 0, j, 0, Nx, 1, 1, Ny, 1)
	rawimage = 255*rawimage/max(rawimage) //4.76237e7
	newimage = RGB(roff*rawimage,goff*rawimage,boff*rawimage)
	} 

	If (wavelength >= 360 && wavelength < 380)
	{
	roff = 1
	goff = ((380-wavelength)/(380-360))**gamma
	boff = 1.0
	
	rawimage = Slice2(dataset, 0, 0, j, 0, Nx, 1, 1, Ny, 1)
	rawimage = 255*rawimage/max(rawimage) //4.76237e7
	newimage = RGB(roff*rawimage,goff*rawimage,boff*rawimage)
	} 


	// if you can get wavelength:
	If (wavelength >= 380 && wavelength <= 440)	
	{
	attenuation = 0.3 + 0.7 * (wavelength - 380) / (440 - 380) 
	roff = ((-(wavelength - 440) / (440 - 380)) * attenuation)**gamma + 1 - (1.0 * attenuation)**gamma 
	goff = 0.0 
	boff = 1.0
	//boff = (1.0 * attenuation)**gamma 
	rawimage = Slice2(dataset, 0, 0, j, 0, Nx, 1, 1, Ny, 1)
	rawimage = 255*rawimage/max(rawimage) //4.76237e7
	newimage = RGB((roff)*rawimage,goff*rawimage,(boff)*rawimage)
	} 
	
	If (wavelength > 440 && wavelength <= 490)
	{
	//attenuation = 0.3 + 0.7 * (wavelength - 380) / (440 - 380) 
	roff = 0
	goff = ((wavelength-440)/(490-440))**gamma 
	boff = 1 
	rawimage = Slice2(dataset, 0, 0, j, 0, Nx, 1, 1, Ny, 1)
	rawimage = 255*rawimage/max(rawimage) //4.76237e7
	newimage = RGB(roff*rawimage,goff*rawimage,boff*rawimage)
	} 
	
	If (wavelength > 490 && wavelength <= 510)
	{
	//attenuation = 0.3 + 0.7 * (wavelength - 380) / (440 - 380) 
	roff = 0
	goff = 1.0 
	boff = ((510-wavelength)/(510-490))**gamma
	rawimage = Slice2(dataset, 0, 0, j, 0, Nx, 1, 1, Ny, 1)
	rawimage = 255*rawimage/max(rawimage) //4.76237e7
	newimage = RGB(roff*rawimage,goff*rawimage,boff*rawimage)
	}
	
	If (wavelength > 510 && wavelength <= 580)
	{
	//attenuation = 0.3 + 0.7 * (wavelength - 380) / (440 - 380) 
	roff = (((wavelength - 510) / (580 - 510)))**gamma 
	goff = 1
	boff = 0
	rawimage = Slice2(dataset, 0, 0, j, 0, Nx, 1, 1, Ny, 1)
	rawimage = 255*rawimage/max(rawimage) //4.76237e7
	newimage = RGB(roff*rawimage,goff*rawimage,boff*rawimage)
	}
	
	If (wavelength > 580 && wavelength <= 645)
	{
	//attenuation = 0.3 + 0.7 * (wavelength - 380) / (440 - 380) 
	roff = 1
	goff = (-(wavelength-645)/(645-580))**gamma 
	boff = 0
	rawimage = Slice2(dataset, 0, 0, j, 0, Nx, 1, 1, Ny, 1)
	rawimage = 255*rawimage/max(rawimage) //4.76237e7
	newimage = RGB(roff*rawimage,goff*rawimage,boff*rawimage)
	}

	If (wavelength >= 645 && wavelength <= 750)
	{
	attenuation = 0.3 + 0.7 * (750 - wavelength) / (750 - 645) 
	roff = 1 
	goff = 1*(((wavelength - 645) / (750 - 645)))**gamma
	boff = 1*(((wavelength - 645) / (750 - 645)))**gamma
	rawimage = Slice2(dataset, 0, 0, j, 0, Nx, 1, 1, Ny, 1)
	rawimage = 255*rawimage/max(rawimage) //4.76237e7
	newimage = RGB(roff*rawimage,goff*rawimage,boff*rawimage)
	}

	If (wavelength >= 750)
	{
	//attenuation = 0.3 + 0.7 * (750 - wavelength) / (750 - 645) 
	roff = 1
	goff = 1 
	boff = 1
	rawimage = Slice2(dataset, 0, 0, j, 0, Nx, 1, 1, Ny, 1)
	rawimage = 255*rawimage/max(rawimage) //4.76237e7
	newimage = RGB(roff*rawimage,goff*rawimage,boff*rawimage)
	}
	

	
	Slice2(NewData, 0, 0, j, 0, Nx, 1, 1, Ny, 1) = newimage
}
Result("\n Scale: " + Scale + " " + Unit + " /frame " + "; & Origin: " + Origin + " " + Unit)
ImageSetDimensionScale(NewData,2,Scale)
ImageSetDimensionOrigin(NewData,2,Origin)
ImageSetDimensionUnitString(NewData,2,Unit)

ImageSetDimensionScale(NewData,0,Scaledeg)
ImageSetDimensionOrigin(NewData,0,Origindeg)
ImageSetDimensionUnitString(NewData,0,Unitdeg)

ImageSetDimensionScale(NewData,1,Scaledeg)
ImageSetDimensionOrigin(NewData,1,Origindeg)
ImageSetDimensionUnitString(NewData,1,Unitdeg)
NewData.showImage()