Skip to main content

How to do PCA for EELS SI in python

PCA is the popular statistic tool to denoise the EELS spectrum image. Here is the simple example to apply PCA by numpy package


==================================

"""

ref:

https://stackoverflow.com/questions/13224362/principal-component-analysis-pca-in-python/49629816#49629816


@author: renfong

"""

import numpy as np

import matplotlib.pyplot as plt

import hyperspy.api as hs


from numpy import argsort

from numpy.linalg import eigh


#%% load data

data = hs.load('t1.dm3').data



#%% define pca

def pca(data, pc_count = None):

    """

    Principal component analysis using eigenvalues

    note: this mean-centers and auto-scales the data (in-place)

    """

    C = np.dot(data.T, data)       # covariance matrix

    E, V = eigh(C)

    key = argsort(E)[::-1][:pc_count]

    E, V = E[key], V[:, key]

    U = data @ V  # equvalent to np.dot(data, V)

    return U, E, V


#%% reconstruction

U, _, V = pca(data, 3)

recons = U @ V.T


""" visualize """

ch = 80

plt.figure()

plt.plot(data[ch,:], label='Raw')

plt.plot(recons[ch,:], label='PCA')

plt.legend()

plt.xlim([800,1800])

plt.ylim([data[ch,1850], data[ch,750]])

plt.show()




====

https://github.com/Renfong/Python-toolbox/blob/main/PCA_numpy.py


Comments

Popular posts from this blog

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...

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...

Drift correction in Matlab

In order to improve S/N ratio, microscopist uses several short acquisition time images, and then sum them up. So the drift correction is very important. Here is the demo of how to use Matlab do drift correction. In the first, load an image, and using circshift function to shift the object in the image. Then use fft cross correlation to compute the moving distance. Finally, shift the object to the origial position. Here is the testing code: == % Demo of drift correction % 2018/11/15  by Renfong im1= imread('cameraman.tif');    % reference image [sy,sx]=size(im1); % shift the object im2=circshift(im1,[20,10]);    % the object moved down 20 pixels and moved right 10 pixels. figure(1); subplot(121);imshow(im1); subplot(122);imshow(im2); % Using fft cross correlations to detect the moving distance[1] fftim1=fft2(im1); fftim2=fft2(im2); cc=fftshift(ifft2(fftim1.*conj(fftim2))); [shiftY,shiftX]=find(cc==max(cc(:))...