Skip to main content

The NEWTEC HSTI package contains fundamental functions for the data analysis of hyperspectral thermal images (HSTI).

Project description

This package contains functions used in data processing of hyperspectral images captured using a scanning Fabry-P��rot interferometer (FPI). This includes transmission simulations of the FPI itself.


Key Features:

  • Image importing

  • Most common image analysis

  • Fabry-P��rot simulation

The Quick Start below can be executed given that the following points are at hand:

  • A hyperspectral long wavelength infrared image with the following tree structure:

      - images/
          - capture/
              - RGB.pnm
              - step4.pnm
              - step13.pnm
              .
              .
              .
              - step1327.pnm
      - output.txt
      - properties.json
    
  • An example of an absorption spectrum (which may be acquired from an FTIR spectrometer)

      #The quick start below uses a .csv file which contains a transmission measurement of ethylene gas.
    
      - Ethylene.csv
    
  • A sensor response function in the form of a pickle file

      #The quick start below also uses a pickle file containing the sensor response of the camera.
    
      - sensor_response.pkl
    

Quick Start

  1. Installation - Run pip3 install HSTI.

  2. Importing the HSTI package in a e.g. Jupyter notebook or .py file along with other relevant packages

     import HSTI
    
     # packages required for running the code blocks below
    
     import matplotlib.pyplot as plt
     import numpy as np
     from scipy.interpolate import interp1d
     import pickle
    
  3. Importing a hyperspectral image from an experiment directory

     # The path below should be changed to the specific path used on the local PC
     path = '/home/user/experiments/experiment_1'
    
     HS_image = HSTI.import_data_cube(path)
    
  4. Performing a PCA of the hyperspectral image

     PCA_object = HSTI.PCA(hsti.flatten(HS_image)) #Perform pca
     pca_img = PCA_object.scores.reshape(HS_image.shape) #reshape scores into same data structure as the original HS image
    
  5. Visualising the principal components

     #import string for labelling images
     import string
    
     fig,ax = plt.subplots(4,4,figsize=(14,16.0))
    
     newtec_cm = HSTI.import_cm()
    
     plt.rc('xtick', labelsize=8)
     plt.rc('ytick', labelsize=8)
     plt.rc('axes', labelsize=10)
     plt.rc('lines', linewidth=2)
     plt.rc('legend', fontsize=8)
     plt.rc('figure', titlesize=10)
     plt.rc('axes', titlesize=10)
    
     axs = ax.flat
    
     for idx,ax in enumerate(axs):
    
       _std = np.std(pca_imgs[:,:,idx])
       _mean = np.mean(pca_imgs[:,:,idx])
    
       if idx < 16:
         im = ax.imshow(pca_imgs[:,:,idx],vmin = _mean-2*_std,vmax = _mean+2*_std, cmap=newtec_cm)
         ax.text(0.5, 0.92, 'PC' + str(idx+1), transform=ax.transAxes,
             size=12, weight='bold', horizontalalignment='center',color='white')
    
         ax.text(0.02, 0.92,'(' + string.ascii_uppercase[idx] + ')', transform=ax.transAxes,
         size=10, weight='bold',color='white')
    
       if idx == 0 or idx == 4 or idx == 8 or idx == 12:
         ax.set_ylabel('Y [y$_j$]')
    
       if idx > 11:
         ax.set_xlabel('X [x$_i$]')
    
    
     plt.tight_layout()
     plt.savefig('experiment_1' + '_PCA' + '.png', dpi=100, bbox_inches='tight')
    
  6. Simulating the Fabry-P��rot transmission based on an absorption spectrum

     X_min = 3.6 # ��m
     X_max = 14  # ��m
    
    
     lam = np.linspace(X_min,X_max,150)
     wvls = np.linspace(7.5,16,1000)
    
     sys_matrix, R_matrix = HSTI.fpi_gmm(lam*10**-6, wvls*10**-6, n_points = 9)
    
     with open('sensor_response.pkl', 'rb') as file:
         sensor_response = pickle.load(file)
    
    
     C2H4 = np.loadtxt("Ethylene.csv", delimiter=",")
    
     wvls_C2H4 = 1/(C2H4[:,0]*100)
    
     f = interp1d(wvls_C2H4*10**6, C2H4[:,1])
    
    
     C2H4_sim = []
     BB = []
    
     for i in range(sys_matrix.shape[0]):
         BB.append(np.sum(sys_matrix[i,:]*sensor_response(1/(wvls*10**-6))*np.ones(len(wvls))))
         C2H4_sim.append(np.sum(sys_matrix[i,:]*sensor_response(1/(wvls*10**-6))*f(wvls)))
    
     BB = np.array(BB)
     C2H4_sim = np.array(C2H4_sim)
    
    
     fig,(ax1,ax2) = plt.subplots(1,2,figsize=(12,4))
    
    
     ax1.set_title("Simulation of raw spectra")
     ax1.plot(lam,C2H4_sim-C2H4_sim[0],label = "Ethylene")
     ax1.plot(lam,BB-BB[0],label = "Blackbody")
     ax1.set_ylabel("Intensity [a.u.]")
     ax1.set_xlabel("Mirror Separation [��m]")
    
     ax1.ticklabel_format(axis="y",style="sci",scilimits=(0,0))
     ax1.legend()
    
    
     ax2.set_title("Simulated spectra with BB as a reference")
     ax2.set_ylabel("Intensity [a.u.]")
     ax2.set_xlabel("Mirror Separation [��m]")
     ax2.plot(lam,(BB-BB[0])-(C2H4_sim-C2H4_sim[0]),label = "Blackbody - Ethylene")
     ax2.plot(lam,(BB-BB[0])-(BB-BB[0]),label = "Blackbody - Blackbody")
    
    
     ax2.ticklabel_format(axis="y",style="sci",scilimits=(0,0))
     ax2.legend()
    
     plt.tight_layout()
    
     plt.savefig("Simulated_Ethylene.png", dpi=600)
    

Contact

For bug reports or other questions please contact mani@newtec.dk or alj@newtec.dk.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hsti-0.0.103.tar.gz (91.3 kB view details)

Uploaded Source

Built Distribution

HSTI-0.0.103-py3-none-any.whl (99.9 kB view details)

Uploaded Python 3

File details

Details for the file hsti-0.0.103.tar.gz.

File metadata

  • Download URL: hsti-0.0.103.tar.gz
  • Upload date:
  • Size: 91.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.8.10

File hashes

Hashes for hsti-0.0.103.tar.gz
Algorithm Hash digest
SHA256 1d79518615c19dc13e6f37568b5c512bbd67ad2296795d4d6b643278a98e1e6e
MD5 b7e4b4357eea894c8bf97247d9ff6bf3
BLAKE2b-256 5b9b0c35d10cc89267bb90951a9a87cf27dedb002cecd7e6f8a437a65c416906

See more details on using hashes here.

File details

Details for the file HSTI-0.0.103-py3-none-any.whl.

File metadata

  • Download URL: HSTI-0.0.103-py3-none-any.whl
  • Upload date:
  • Size: 99.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.8.10

File hashes

Hashes for HSTI-0.0.103-py3-none-any.whl
Algorithm Hash digest
SHA256 14c5748922b84621e6a3cebc4230d464ec8e7335560dea1121858f3b66e12085
MD5 961f5b5d36bc1341fa278761cd734242
BLAKE2b-256 0426a938e649834f82f8ae115efb3b4da9b302951e3d14556226f3653f226eca

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page