Skip to main content

Top hat filter

The top_hat filter can be used to detect the relatively small edges/peaks superimposed on large background signals. The concept came from the EELS workshop during IMC19. Thanks to Prof. Nestor J. Zaluzec.

--

// Using Top_hat digital filter to detect the  relatively small edges 
//    superimposed on large background signals.
//
// ref: Ultramicroscopy 18 (1985) 185-190 
//      Digital Filters  for Application to Data Analysis in EELS
//      by Nestor J. ZALUZEC

// Parameters:

// win_s: signal window (default:3)
// win_b: background window (default:3)
//  a_s : amplitude of signal (fixed value)
//  a_b : amplitude of background  (fixed value)

// Renfong 2018/10/11


// Main function

image Top_Hat_Filter(image img, number win_s, number win_b)
{
// read image
string fname=img.GetName()
number sx,sy
img.getsize(sx,sy)

// filter
image img2 := imageclone(img)*0

//the area between signal and background must be equal
number a_s=1
number a_b=a_s/(2*win_b/win_s)

number i
for(i=-1*(win_s-1)/2;i<=(win_s-1)/2;i++)
{
img2=img2+a_s*img.offset(i,0)
}

for(i=0;i {
img2=img2-a_b*img.offset(-1*(win_s+1)/2-i,0)
img2=img2-a_b*img.offset(1*(win_s+1)/2+i,0)
}

img2=tert(icol<(win_s-1)/2+win_b,0,img2)

img2=tert(icol>=(sx-(win_s-1)/2-win_b),0,img2)
img2.setname("TH-Filter of " + fname)
img2.showimage()
img2.ImageCopyCalibrationFrom(img)
img2.ImageSetIntensityUnitString( "a.u." )
return img2
}

// Main script
image img := GetFrontImage()
number win_s = 3
number win_b = 3

Top_Hat_Filter(img,win_s,win_b)


--

Test results

Comments

Popular posts from this blog

HyperSpy - read the calibration information in a dm3/dm4 file

Some example of dm3 file reading by using Python HyperSpy package, which can read the detail information of the dm file. -- # import packages import numpy as np import hyperspy.api as hs # load file sp=hs.load('sp.dm3') # Read the axis information      # Print all the calibration detail print(sp.axes_manager) ''' <Axes manager, axes: (272|2042)>             Name |   size |  index |  offset |   scale |  units  ================ | ======= | ====== | ======= | ======= | ======                     x |    272 |      0 |       -0 |  0.0025 |     µm   --------------- |  ------ | ----- |  ------ | ------- | ------    Energy loss |  2042 |         | 3.2e+02 |       1 |     eV...

MLLS in matlab

MLLS stands for  multiple linear least squares fitting, which is the common strategy for the solving EELS edge overlapping and which is also built-in the GMS software. The target spectrum Y and the reference spectrum X Y = A * X Assuming Y is 1*256 matrix and we have three reference spectrums, ie, X is 3*256 matrix. So A is 1*3 matrix. The target is to solve A. If Y and X are n*n matrices, we can use the simple formula Y * inv(X) = A * X * inv(X), ie., A = Y * inv(X). However, Y and X are not n*n  matrices, it is necessary to have some trick to solve it. We can multiply the transpose matrix to produce n*n matrix. Y * X' = A * X * X'  (ps X' means the transpose matrix of X) so A = Y * X' * inv(X * X') Here is the Matlab code: =========  % create target spectrum x=0:256; c=[90,120,155]; sig=[5,10,8]; int=[5,10,8]; xn=zeros(size(x)); ref=zeros(length(c),length(x)); factor=rand(size(c))'; for i=1:length(c)     xn=xn+int(i)*ex...