Using the m3xSpectroCam, basics.

M3X has started to apply the spectrometer+camera registered method to OceanOptics STS spectrometer. see ref.

The developers kit is based on the Raspberry Pi and the software environment is mostly Python and web based. This new programming environment stimulated a review of actual user requirements assuming most of our users are related to the field of remote sensing.

The current data acquisition interface is based on using the usb2000+ spectrometer, an RGB camera and the C# language. A screendump of the GUI is shown below:

Question: how black is black paint ?

Question: how black is black paint ?

The figure shows the inside of the STS case, next to a white reflectance target. The red rectangle indicates the FOV of the spectrometer.

The goal (or question) of the user is to know if the paint is absorbing photons over the range from about 400-1000 nm. > the user requires an estimate of the reflectance of the material surface (white nylon+ paint0) in the FOV of the spectrometer and an estimate about the accuracy of the reflectance.

To reach this goal the following functions or methods derived from subgoals are needed.

1. reflectance_relative_to_white = photon_flux_object / photon_flux_white .

1.1 photon_flux = photon_count / integration_time/ solid_angle, array

1.2 photon_flux_white, same type as 1.1 but from a different object

1.1.1 integration_time : stored in the specific data_record, milliseconds.

1.1.2 solid_angle : can be derived from the FOV rectangle , common to all data records.

1.1.3 photon_count = electron_count_photons / quantum_efficiency   : method divide array quantum_efficiency :  can be determined by irradiance calibration :method calibrate array =  (electron_count_photons/integration_time) / (photon_count/integration_time) , same aperture for calibration and application. electron_count_all = NLC(voltage_count_all) : Non_Linear_Correction method: spline, array electron_count_all = voltage_edc + electron_count_dark + electron_count_photons: array .  electron_count_dark ,method: save data record, the aperture is closed, no photon flux, only thermal electron (flux). electron_count_photons = EDC(electron_count_all) – EDC( electron_count_dark) : method EDC, method subtract electronic dark voltage, array

After reaching / solving all subgoals the main goal  reflectance_relative_to_white, array is solved using

methods: array.subtract , array.multiply, array.divide, array.spline ,

calibration data: EDC(index), NLC(spline coefficients),

reference data: stored Dark_Reference(electron_count, integration_time)

temporary data: (white)_Reference(electron_count, integration_time).

The model is only complete with:

Wavelenght(index) = Spline(index, coefficients) .

The aperture FOV is modelled as a rectangular slit with centre Xedge, Yedge at the 0.50 reflectance response of X or Y edges between dark and white objects.

Edge response 0.50 mix of black and white.

Edge response 0.50 mix of black and white.

If the dark reflectance is near 0, the 0.50 mix is found when the reflectance_mix =0.5

In the general case

reflectance_Z(X,Y,m) = m* X +(1-m)* Y ; probability , array;

Goal: find mixing ratio m : given X,Y,Z

Method: for each array element: m*(X -Y) = (Z-Y)  or m = (Z-Y)/(X-Y)  ,arrays X,Y,Z

The goal is reached, the problem solved if

data_registers array X,Y,Z   result array m : 0 <= m <= 1, not (X-Y) = 0;

array.subtract , array divide, if ==0 , then X==Y -> Z=X=Y .


Mixing triangle : goal find the mixing parameters  arrays u,v given

unknown array U, given arrays X,Y,Z of reflectance.

[key sumnorm  ]

u =