Updates in version 1.1.5 ‘Bleys’ (04/11/2015)
Features
- Spectral Library now has metadata field that can store string and retrieve string information within SLZ files
- Added support for loading and saving of reflectance cubes. Reflectance cubes saved by Scyllarus will be tagged with a metadata flag to indicate they are reflectance, this flag is checked for when loading image cubes.
- Added a getter for the GDAL image handle to hdr_input, which can be used to access image metadata such as geo-tags that may be associated with the image.
- Added Band Maths which can be used to perform arithmetic and thresholding operations on images via string input commands. See documentation for details.
- Added Tif_Input features: Load image wavelengths from an ENVI style HDR file, load a directory of TIFF files as one image cube.
Changes
- Added a check to make sure band removal doesn’t reduce an image to less than 2 bands.
- Added the option to several Pipeline image manipulation functions (crop, resize, etc) to operate on reflectance cubes rather than the irradiance cube.
Fixes
- Improved exception handling and messages in several input classes.
- Fixed overflow issue with SLZ file loading.
- Fixed an issue with normalisation affecting some reflectance cube processing.
- Fixed a bug with HSZ HDF5 compression settings.
- Fix for crash when unmixing if materials have NaN values.
Updates in version 1.0.3 ‘Florimel’ (29/06/2015)
Features:
- Added ‘spectral_derivative’ function that calculates the spectral gradient for each pixel in an image.
- Added new image filter ‘Savitzky Golay’, which provides smoothing in the spectral domain.
- Added a new image filter ‘Moving Average’ which provides smoothing in the spectral domain.
Changes:
- Changed the pipeline filter() method to take a new argument ‘method’.
- Added enum for filter types.
Fixes:
- Fixed issue where pipeline input would be reset when performing image manipulation functions.
- Fixed problem with destructing GDAL objects (Causing hdr_input to fail when being destroyed)
- Fixed issue with certain .hdr files that caused wavelengths to be read as 0.
Updates in version 0.9.17a (22/04/2015)
Important: All lib files have been prefixed with ‘scyl_’ to explicitly identify them as part of the scyllarus library (scyl_io, scyl_pipeline, scyl_processing, scyl_utility)
Features:
- Added Support Vector Machines classifier ‘svm()’ which takes a reflectance cube and list of spectra and classifies each pixel to the spectra.
- Added new Illuminant recovery algorithms:
- Grey Edge
- Grey World
- Finlayson and Schaefer
- Shade of Grey
- White Patch
- Added error checking feature to demo program ‘cli_pipeline’ (can be used to determine the error of reconstructed images)
- Added filters to the endmember getters and delete functions
- Added ‘mean’ functions to spectral_library to get the mean values of spectra with multiple entries in the library (Spectral libraries are now intended to save ‘raw’ data consisting of several entries of the same label, which can be used with classification algorithms such as SVM)
- Added new image getters – I(bands), I(ROI) and I(bands, ROI) for retrieving subsets of images. When used with HDR input, this can save memory by only loading subsets of cubes from disk.
- Added datatype save options to HDR/ENVI classes, allowing for data to be saved in the following formats: Uint8, Uint16, Int16 and Float
- Added new helper functions to the pipeline class for clearing data
- Add function ‘resample_image()’ that can be used to spectrally resample images using NURBS
- Added functions ‘process_classification()’ and ‘process_analysis()’ to the pipeline object
Changes:
- Changed HDR/ENVI input to use GDAL for file I/O. (Added partial support to load tif files)
- Updated the pca() function to include progress reporting via the logger
- hdr_input will attempt to ensure that wavelength values are returned in nm (if for some reason they are stored in um)
- Added constructor for empty slz object that has specified dimensions
- Updated colour_jet() to be robust to outlier
- Changed the way parameters are passed to recover_global_illuminant(), now uses a parameter struct/object called ‘illuminant_options’, the object has default values
- The above change was also made for recover_materials()
- Updated the filtering function to include progress reporting
Fixes:
- Fixed a bug preventing reading endmembers from HSZ files
- Fixed a bug causing HSZ’s to be saved with null wavelengths
- Fixed a bug in illuminant recovery for images with values in the [0 1] range
Updates in version 0.7.37a (20/10/2014)
Features:
- Added Principal Component Analysis function ‘pca’ which takes an images cube and returns the n first principal components.
- Added Spectral Angle Mapping classifier ‘sam’ which takes a reflectance cube and list of spectra and finds the closest spectra to each pixel by angle. The function can also be used to obtain the pairwise angle of each pixel/spectra pair, or return the N closest spectra to each pixel.
- Added Colour Jet function ‘colour_jet’ that can be used to colourise a greyscale image. 0 values appear blue and max values appear red (Can be used to visualise results from PCA).
- Added new Material Clustering method ‘DASAM’ which uses SAM to provide pseudo-probabilities as abundances (Based on the normalised angle).
- Added Endmember getters (endmembers(), endmember_labels(), endmember_abundances() and endmember_abundance_indexes()) to HSZ input, to read Endmember data stored in HSZ files.
- Added Endmember save/load capabilities to component_input and component_output classes. Spectral libraries are saved as SLZ files.
- Added Endmember getters and setters to data_input class.
- Added ‘label_map’ to Spectral Library class, which allows you to see what files specific Endmembers have been loaded from.
- Added function variations to ‘delete_endmembers’ in Spectral Library class that allow for deletion by label and by input file name.
- Added a variation of ‘endmembers()’ in Spectral Library to get Endmembers by the filename they were loaded from.
Changes:
- Changed error checking to make sure images have at least two bands (minimum required) before allowing processing. This prevents certain crashes/deadlocks.
- Several minor performance improvements across the code – optimisations of data accesses, small additions to concurrent sections, optimisation of redundant code sections.
Fixes:
- Fixed a case where ‘unmix_by_spectral’ would crash if the given list of spectra had less than 5 spectra in it.
- Fixed an SLZ read/write compatibility issue with MATLAB.
Updates in version 0.7.17a (03/09/2014)
Features:
- New Pipeline method ‘process_recover_endmembers()’ performs endmember indexing of a processed image’s materials with respect to a loaded Spectral Library.
- HSZ files can now be save with endmember indexed materials (With endmembers and their labels also stored within the HSZ files)
Changes:
- Updated ‘unmix_spectra’ function to normalise inputs before processing (So they can be properly compared)
‘unmix_spectra’ will now resize input data to be compatible, and if necessary drop bands from the input image if they aren’t covered within the given spectra. - Made changes to setters and process() functions within the pipeline class such that whenever I is changed (cropped, resized, reset etc), any processed image results will be deleted (as they are considered invalid). This effect also cascades back to input objects (i.e. if a loaded file has stored processed results, these will become inaccessible after modifying I or re-running the processing). There are flags in place to subvert this behaviour if necessary.
- Changed the HDR input class to first search for a list of ‘prioritised’ data files (‘.fla’, ‘.raw’, ‘.img’, ‘.dat’, ‘.dem’) before reverting to other extensions. This fixes a problem with reading in images when there were other files with the same basename present in the folder.
- Changed dimensions from ‘int’ to ‘unsigned int’ within inputs and pipeline.
Fixes:
- Fixed the way I and S are reconstructed in Component_Input to accommodate different use cases.
- Fixed a problem with std::acos having different cross-platform behaviour for undefined results.
- Fixed Pipeline.crop() dimension checking (previously off by 1).
- Fixed Illuminant recovery not considering patches on the rightmost and bottom cols/rows within an image.
- Fixed zero_to_one performing unsafe float comparison.
Updates in version 0.6.19a (05/08/2014)
Features:
- Added ‘Spectral Library’ class which has the following features:
- Load and Save SLZ (Spectral Library) files.
- Combine and re-save libraries.
- New utility function ‘resample_endmembers’ uses NURBS to ‘resize’ spectral signatures to the desired number of bands (this is done automatically by spectral_library::add_library).
- Added *Experimental/Not Fully Tested* Fast Material Segmentation ‘DAQ’, which finds materials using a subsampled image and then classifies pixels via ‘unmix_by_spectra’ (also Experimental/Not Fully Tested).
- Added functionality to HDR input/output classes to read and write exposure times from the description string (as stored by some cameras), this data can be accessed using the input::exposure_times() function for appropriate input types.
- Moved all enumerated types to ‘scyllarus_types.h’
- Added enumerated type for inputs and outputs (eg scyl::HDR) and added a function ‘type()’ to all IO classes that returns the appropriate type.
- Logger console output now has a cool progress bar (for 0 < debug < 3 ).
- Added new output class ‘component_output’ that can be used to save individual (or all) pipeline data components as separate HDR files (I, Illuminant, k, g, s, Elements, Abundance and Indexes).
- Added new input class ‘component_input’ that can be used to load data saved by component_output back into the pipeline. The class can also reconstruct certain components from others (For example, to save disk you could not store I and/or S and have them reconstructed from other components).
- Added Image Utilities class with several functions:
- compute_greyscale – get a greyscale representation of a hyperspectral image.
- compute RGB – get a colour representation of a hyperspectral image.
- reconstruct_I, reconstruct_s, reconstruct_illuminant.
- Added Photopic function look-up table (390 – 830nm, integer) and Camera Sensitivity function lookup table (380 – 720nm, 10nm increments, R, G, B channels).
Changes:
- recover_materials now throws an exception when temperature parameters are invalid rather than just printing an error message.
- Enhanced OpenMP performance by naming critical sections – now non-conflicting sections will be executed in parallel.
- Changed remove_bands function input type from std::vector<int> to arma::uvec.
- Re-arranged the material recovery functions – There is now no separate function ‘process_generate_abundances()’ in the pipeline – this step is factored into the ‘process_recover_materials()’ step.
- Update data_input to contain setters for all image components. This class can be used for loading custom data into the pipeline (e.g. from a camera or loaded from armadillo save files etc).
- Added a check for NaNs in loaded HSZ objects.
- Updated pipeline exceptions to be more descriptive.
- Added exceptions to the pipeline for when the input object components are empty and the pipeline’s corresponding member is also empty (Previously it was assume an input object would always have ‘I’ where now it may not).
Fixes:
- Fixed a bug where the logger would crash due to concurrency issues.
- Fixed scale_ functions not checking for minimum dimensions (and as a result would crash when attempting to resize to less than 1×1).
- Fixed an issue where a HSZ file with the same basename as a HDR file could be mistakenly loaded as the HDR file’s data file, resulting in an apparently corrupt image.
- Modified percentage reporting to be more consistent and accurate.
- Fixed an issue with HDR input that prevented files with one band from being loaded.
- Fixed an issue that caused a crash when saving if there was no input object present in the pipeline.
- Fixed a possible small memory leak in iotools->hsz.
Updates in version 0.5.18a (04/06/2014)
Features:
- New parameter ‘illuminant_fast_50’ in pipeline: when set to true (default) the Illuminant Recovery method is optimised to run much faster for images with 50+ bands.
Expect an approximately 10x speed-up for Illuminant recovery on images with 400+ bands. Does not affect images with less than 50 bands.
Changes:
- Updated the HSZ I/O to have more verbose output for errors.
Fixes:
- Fixed a bug where HSZ files could cause a crash if they contained unknown parameters – they are now ignored.
- Fixed a bug with the HSZ saved illuminant vector orientation (Affects MATLAB Compatibility only)
Updates in version 0.5.16a (13/05/2014)
Changes:
- Added more explicit exception message when a HDR file fails to load.
- Material data is checked for NaN values before saving as HSZ (Removes rare bug)
- Added several new fields to HSZ files.
- Changed how filtering works in Illuminant recovery.
- Added several checks and safeguards to HSZ file reading to prevent crashes when data is corrupted.
Fixes:
- Fixed a bug in the NNLS solver that produced incorrect highlights in some cases.
- Fixed an issue with HSZ loading/saving that resulted in re-saved HSZ files to have extra blank data fields.
- Fixed an issue related to the above which resulted in poor results reconstructing images from HSZ files
- Fixed Matlab/C++ HSZ compatibility issues.
- Fixed a NURBS encoding issue with K.
Updates in version 0.5.11a (28/03/2014)
Features:
- Added Resize function to Pipeline Class – allows for memory efficient resize of the set Image cube.
- Added Crop function to Pipeline Class – as above.
- Added Remove Bands function to Pipeline Class – as above.
- Added Filter function to Pipeline Class – allows for memory efficient filter of the set Image cube. (Wiener filter)
- Added Align Bands function to Pipeline Class – allows for memory efficient band alignment of the set Image cube. (Using FFT phase correlation – check results visually before processing images)
- Added Pointer functions for I and S in Pipeline and Input classes.
Changes:
- Data_Input class now sorts bands when the Image and Wavelengths are set.
- If a Pipeline processing stage fails, potentially corrupt/invalid data will now be cleared, i.e. if the Illuminant Recovery fails, Illuminant and I will be set to 0.
- Changed arma::cube ‘big_k’ to a float ‘factor_k’ to save memory, as this matrix is currently filled with identical values.
- Updated Documentation.
Fixes:
- Fixed issue with abort function and threading.
- Fixed issue with abort function not resetting to a ‘no abort’ state.
- Fixed issue with Material Clustering reporting the incorrect percentages to Logger
Updates in version 0.5.7a (7/03/2014)
Features:
- Extensive documentation updates, especially to the Pipeline class, describing parameters.
- Added abort flag to logger class, allowing for processing functions to be exited prematurely if desired.
- Added new function ‘sort_bands’ which sorts an image cube’s bands into ascending order of wavelengths. The routine sorts with a 1 band memory overhead.
Changes:
- Removed unused threshold from Illuminant code.
- Change ‘hdr’ and ‘hdr_input’ classes to use less memory when reading in images. Image data is no longer stored in temporary memory for conversion (and as such, no more memory than the size of the image should be used)
- Updated the HSZ class to allow the user to select if they want images to be reconstructed as called or have the reconstructed image stored in memory after construction. (Memory flexibility)
- Changed Input member access functions to be const to allow for better memory management when called.
Fixes:
- Change ‘mean threshold’ in select smooth patches to be automatically calculated, rather than specified by the user/calling routine, thus preventing illuminant recovery failure for images that have unusual dynamic range.
Updates in version 0.5.3a (14/02/2014)
Features:
- Added NURBS encoding support to pipeline for saving of HSZ Files (See documentation and example program for usage).
- NURBS Files can be read and written in HSZ format by the input/output classes.
- Functions to encode NURBS curves (generate_nurbs()) and reconstruct (nurbs_reconstruct_image()).
- Pipeline support for NURBS settings.
- Added image registration function register_image_bands() to compute (small) displacements among image bands and align_image_bands() to register images based on displacements.
Changes:
- Added an option to choose if you want to filter the image before processing (set_filter_image() in pipeline)
- Modified HSZ format to prevent precision errors that would have occurred using NURBS (and in Matlab)
- HDR input class now sorts image bands by ascending wavelength order.
- Input class changed to remove code duplication – Parent class ‘Input’ now contains function implementations (That return exceptions) such that child classes only need to implement functions that will return something useful.
- Data type of abundance indices and material map is not umat (unsigned integer) rather than float.
- Changes BLAS and LAPACK dependencies on Windows to use ‘CLAPACK’ which is thread safe, thus improving performance for parallel code.
Fixes:
- Fixed an issue with HSZ classes that prevented loading and re-saving of HSZ images
- Removed extraneous check from HSZ_output that would prevent from saving unnecessarily.
- Fixed some bugs in pipeline setters set_I and set_s (Not properly resetting members)
Updates in version 0.4.2a (20/12/2013)
Features:
- Added Data Input class for generic input into pipeline (In a more managed way than using the pipeline’s ‘set_I()’ method.
- Added a new master header file ‘scyllarus.h’ which can be used to include all the library’s headers easily.
- Added a new Non Negative least squares solver function to replace the one from the TSNNLS library. New solver executes in less time as well as allowing for greater parallelism.
Changes:
- Input classes throw exceptions instead of returning zeroed data for members that do not exist for a given input type (e.g. HDR does not have reflectance)
- Parallel optimisation of Material Element Generation
Fixes:
- Fixed some exception logic errors.
- Added more dimension checks to the setters in the Pipeline object to help ensure data consistency.
Updates in version 0.3.21a (02/12/2013)
Features:
- Saturation threshold for patch selection in Illuminant Recovery is now dynamically calculated.
Changes:
- Pipeline checks when members are changed to make sure they are dimensionally compatible with existing data. (Pipeline will reset dependent member variables when certain set() methods are called (as the data is invalidated)).
- Changed the indexing of material maps loaded from HSZ files to start from 1 to properly reflect the format.
- Minor performance improvements in Material Recovery.
Fixes:
- Fixed HDR reader not being able to load files from current directory.
- Fixed a bug where the pipeline would crash if data was mismatched.
- Fixed a bug performing Illuminant Recovery on images with unconventional data scales.
- Fixed a bug when loading HSZ files that would cause Illuminant recovery to fail.
Updates in version 0.3.13a (15/11/2013)
Features:
- Added timing feature to cli_pipeline.
- Added ability to save the reflectance cube to hdr_output.
- Added logger class (which can be used to save a log file after program execution).
- Added ability to set Illuminant recovery algorithm patch size.
Changes:
- Performance optimisations including multi-core support for some algorithms.
- Pipeline now resets certain members when you call the ‘set_I()’ function.
- HDR input now supports data files with any file extension, so long as the basename matches, e.g. if ‘file.hdr’ is specified ‘file01.raw’ is a valid data file, as is ‘file01.fla’ or ‘file01.egg’.
Fixes:
- Fixed a bug when re-throwing exceptions.
- Fixed a bug when compiling with Boost on Windows using VS2012.
- Fixed an issue when running the pipeline multiple times successively on the same pipeline object.
- Fixed a bug when using pre-selected patches with Illuminant recovery.