Diffractogram.txt
// diffractorgram.s
//
// computes the evenly spaced diffractogram from an arbitrarily sized image
// The following 2 variables control the way the diffractogram id computed:
number padWithWholeImage = 0
number stretchDiffractogram = 1
realImage img
complexImage DoFFTw(image img)
{
number Nedge = 100
complexImage inImg
realImage imgSel
number top, left, bottom, right, width, height,sx,sy,w2,h2,sizeX,sizeY
string name
// get the size of the original image subsection:
img.GetSize(sizeX,sizeY)
img.GetSelection(top, left, bottom, right)
// get the size of the image:
width = right - left
height = bottom - top
h2 = height/2;
w2 = width/2;
if (padWithWholeImage) {
imgSel := RealImage("modified image",4,sizeX,sizeY)
imgSel[top,left,bottom,right] = img[]
imgSel.SetSelection(top, left, bottom, right)
}
else {
imgSel = img[]
imgSel.SetSelection(0,0, height, width)
}
// subtract the mean of the image from the image itself
number avg = mean(img[]);
imgSel[] -= avg;
if (Nedge > w2/2) {Nedge=w2/2; }
if (Nedge > h2/2) {Nedge=h2/2; }
// smoothen the edge of the image:
Image rampX = ExprSize(width,height,w2-abs(icol-w2))/Nedge
Image rampY = ExprSize(width,height,h2-abs(irow-h2))/Nedge
imgSel[] *= tert(rampX>1,1,0.5*(1-cos(Pi()*rampX)))*\
tert(rampY>1,1,0.5*(1-cos(Pi()*rampY)))
deleteimage(rampX)
deleteimage(rampY)
if (padWithWholeImage) {
width = sizeX;
height = sizeY;
}
if (stretchDiffractogram) {
if (width < height) width = height;
if (height < width) height = width;
}
// showimage(imgSel)
// create a new image and copy the original image into it.
// make sure that the parts of the new image that are not overwritten
// by the original, are filled with its average value
inImg := ComplexImage("real space Image", 8, width, height)
if (padWithWholeImage) {
inImg[0,0,sizeY,sizeX] = imgSel
}
else {
inImg[0,0,bottom-top,right-left] = imgSel
}
// compute the FFT and shift the center:
T_fft_C2C(inImg,inImg)
inImg = T_shiftImageCenterComplex(inImg)
// set origin, name and scale:
img.GetName(name)
inImg.setOrigin(floor(width/2)+0.5, floor(height/2)+0.5)
inImg.setName("FFT of " + name)
img.getScale(sx,sy)
inImg.setScale(1/(width*sx),1/(height*sy))
inImg.setUnitString("1/nm")
deleteImage(imgSel)
return inImg
}
if(!GetFrontImage(img))
{
okDialog("There is no Image.")
exit(0)
}
T_fft_SetEstimate()
showImage(DoFFTw(img))