Spectral Python Changelog

What's new in Spectral Python 0.16.1 Beta

Oct 29, 2014
  • Bug Fixes:
  • Missing import statements for pixel iterators.

New in Spectral Python 0.16 Beta (Oct 20, 2014)

  • New Features:
  • Adaptive Coherence/Cosine Estimator (ACE) target detector
  • Pixel Purity Index (PPI)
  • Adjustable linear color stretches (based on data limits or cumulative histogram)
  • Ability to save ENVI Classification files (thanks to @ohspite)
  • `ImageView` class has `set_title` method
  • Changes:
  • `imshow` image displays use a linear 2% color stretch by default (can
  • override this in `spectral.settings`)
  • Limited Python 3 compatibility (all functions except `view_cube` and `view_nd`) supported
  • `get_rgb` handles bands with no variation (color set to min value)
  • Modified `view_nd` to support change in PyOpenGL API
  • Bug Fixes:
  • Incorrect handling of alternate file extensions in `envi.save_image`
  • Incorrect handling of unsigned byte data type in ENVI files
  • As of version 1.9, `numpy` no longer provides `oldnumeric` submodule

New in Spectral Python 0.15 Beta (Jun 5, 2014)

  • New Features:
  • Added Minimum Noise Fraction (`mnf`) algorithm (a.k.a., Noise-Adjusted Principal Components). An associated `noise_from_diffs` function enables estimation of image noise from a homogeneous region of the image.
  • Changes:
  • When calling `envi.save_image`, assume an ndarray with two dimensions is a single-band image (i.e., don't require an explicit third dimension).
  • All SpyFile subclass read methods now have an optional `use_memmap` argument to indicate whether the memmap interface should be used (vice direct file read) on a per-call basis. Default values are specific to the particular method and file interleave.
  • Bug Fixes:
  • Handle recognize comment lines in ENVI headers and accept blank parameter values in the header.
  • Garbage results were being generated for several algorithms when a NaN value was present in the image data. Reasonable checks are now performed in several algorithms and an optional `allow_nan` argument (False by default) was added to `calc_stats`.
  • For images with more rows than columns, the row/col of the pixel under the mouse cursor did not display if the row index was greater than the image width.
  • Performance Improvements:
  • Improved BilFile.read_bands performance.
  • Faster creation/display of RGB images for display.

New in Spectral Python 0.14 Beta (Jun 5, 2014)

  • Changes:
  • Attempt to use Pillow fork of PIL, if available, rather than older PIL.
  • `view_cube` now uses common color scale limits on all side faces.
  • When creating an `AsterDatabase` instance, directories in the `SPECTRAL_DATA`environment variable are search for the specified file (after the currentdirectory).
  • `spectral.imshow` accepts an optional `fignum` argument to render to an existing figure.
  • Class labels in a `spectral.imshow` window can be reassigned even when class labels were not provided in the function call (all pixels will start with class 0).
  • File `spectral/algorithms/perceptron.py` can be used independently of the rest of the package.
  • Bug Fixes:
  • Front and left sides of the image cube displayed by `view_cube` were mirrored left-right. Cube aspect ratio was being computed incorrectly for non-square images. These bugs were introduced by a recent release.
  • Global covariance was not being scaled properly in the `MahalanobisDistanceClassifier`. Mathematically, it does not affect results and did not affect results on the test data but for large covariance with many classes, it could have cause rounding/truncation that would affect results.
  • PerceptronClassifier constructor was failing due to recent changes in base class code. Unit tests have been added to ensure it continues to work properly.
  • Performance Improvements:
  • PerceptronClassifier is roughly an order of magnitude faster due to better use of numpy. Inputs are now scaled and weights are initialized withing the data limits, which usually results in fewer iterations for convergence.

New in Spectral Python 0.13 Beta (Jan 6, 2014)

  • New Features:
  • New features the `ImageView` class returned by `imshow`:
  • Image rasters can be switched between *data*, *class*, and *class overlay* view, using adjustable class alpha transparency.
  • Image pixel regions can be interactively assigned to new classes using mouse/keyboard click & drag interaction.
  • A "zoom" window can be opened from an image view by pressing "z". The zoom window center point can be panned to a new location by holding CONTROL and left-clicking in the original window.
  • Image pixel interpolation can be switched between the module default and *nearest* (by pressing "i").
  • The `view_nd` window can open a class map raster view (by pressing "c") that dynamically shows changed class values.
  • Added a `matched_filter` function, which wraps the `MatchedFilter` class and allows using local background stats using an inner/outer window.
  • `rx` accepts an optional *cov* argument, which specifies a global background covariance. When this argument is given, the background mean will be computed using a moving inner/outer window but the covariance will be fixed.
  • Function `cov_avg` computes covariance averaged over multiple classes (using the mean of each class.
  • Added `msam` (Modified SAM) function by Oshigami et al
  • `matrix_sqrt` optionally returns the square root of the matrix inverse.
  • Created the `WindowedGaussianBackgroundMapper` to easily apply any pixel-based estimator to an image using local background stats computed for an inner/outer window.
  • Performance Improvements:
  • Significant speedup for sevaral algorithms using ndarray inputs:
  • 14x speedup for GMCL
  • 7x speedup for Mahalanobis distance classification
  • 3x speedup for `kmeans`
  • Windowed `rx` is significanty faster from using cached covariance.
  • `matrix_sqrt` accepts an optional *eigs* arguments that makes square root calculation significantly faster.
  • `GaussianStats` object caches eigen-decomposition, make calculation of other covariance-derived stats much faster.
  • Changes:
  • Eigenvectors in `PrincipalComponents` objects (returned by `principal_components`) are now stored in columns (they were in rows) to be consistent with numpy. An explicit check is not performed to ensure eigenvalues are in descending order.
  • Converted `GaussianStats` constructor keyword args to optional positional args.
  • Added numerouse new unit tests.
  • Simplified the unit testing interface, eliminating the need for `test_method` decorator and `TestCase` subclass `run` methods.
  • Converted `SpySettings` object attributes to class attributes.
  • Removed `save_training_sets`. Use `TrainingClassSet.save` instead.
  • Bug Fixes:
  • Exception occured when *bands* argument was not provided to `imshow`.
  • *stretch_all* parameter for `get_rgb` was sometimes being used when set to
  • False or 0 (because it was not None).
  • Fixed broken implementation of `load_training_sets`. `save_training_sets` was also fixed (but implementation is replaced by TrainingClassSet.save`.
  • Fixed a scaling error in `linear_discriminant` and divide by N-1 to get unbiased estimate of *cov_b*.

New in Spectral Python 0.12 Beta (Oct 11, 2013)

  • New Featues:
  • Added a wrapper around matplotlib's `imshow` to easily display HSI data.
  • A new memmap interface is provided for SpyFile objects (via th `open_memmap` method), including the ability to open writable memmaps.
  • Algorithm progress display can be enabled/disabled via the settings object. RX anomaly detection can be performed using local statistics by specifying an inner/outer window.
  • A custom background color can be specified when calling `view_cube`.
  • Summary statistics are printed for unit test execution.
  • Changes:
  • `get_image_display_data` has been renamed `get_rgb`.
  • `view_cube` will also accept an ndaray as the "top" keyword.
  • If present, image band info is saved when `envi.save_image` is called.
  • Allow calling :func:`~spectral.oi.envi.create_image` using keyword args instead of ENVI-specific header paramter names.
  • `save_rgb` automatically determines the output file type, based on the filename extension.
  • Results of several ImageArray methods will be cast to an ndarray.
  • The Image base class is now a new-style class.
  • Bug Fixes:
  • Eliminated texture-wrapping display artifact near edges of displayed image cubes (called via `view_cube`).
  • RX.__call__ was failing when image statistics were not provided to class constructor.
  • Applied Ferdinand Deger's bugfix for `envi.create_image`.

New in Spectral Python 0.11 Beta (Apr 4, 2013)

  • New Featues:
  • RX anomaly detector.
  • Ability to save and create images in ENVI format.
  • Added `GaussianStats` class (returned by `calc_stats`). This class can be transformed by a `LinearTransform`. It has a `get_whitening_transform` method that returns a callable transform to whiten image data.
  • Added a unit-testing sub-package (`spectral.tests`)
  • Changes:
  • Changed several functions to accept GaussianStats objects instead of sepaarate mean & covariance.
  • Changed names of several functions for consistency: - `open_image` replaces `image`. - `save_rgb` replaces `save_image`
  • Improved support for additional data types by reading byte strings into numpy arrays with dtypes instead of using builtin array module.
  • Bug Fixes:
  • 32-bit integer image data was not being read properly.

New in Spectral Python 0.10.1 Beta (Feb 26, 2013)

  • This is a bug-fix release that corrects the spectrum displayed when double- clicking on a raster display. Version 0.10 introduced a bug that had the row/column swapped, resulting in either the wrong pixel being plotted or an exception raised.

New in Spectral Python 0.10 Alpha (Feb 18, 2013)

  • As of this release, SPy now uses IPython for non-blocking GUI windows. IPython should be started in "--pylab" mode with the appropriate backend set (see:ref:`starting_ipython`). The standard Python interpreter can still be used if GUI functions are not being called.
  • New Features:
  • `LinearTransform` and `transform_image` now handle scalar transforms.
  • All functions opening a GUI window will now return a proxy object to enable access to any associated data (e.g., accessing changed class values in an N-D data display).
  • GUI functions are now aware of differences in wxWidgets versions (2.8.x vs. 2.9.x).
  • Changes:
  • SPy no longer requires explicit creation of a new wx thread. Instead, running SPy interactively with GUI functions now requires using IPython in "pylab" mode.
  • A few functions have been renamed for consistency:
  • `hypercube` is now `view_cube`.
  • `ndwindow is now `view_nd`.
  • numpy is used for more covariance calculations (e.g., class-specific covariance) to improve performance on multi-core systems.
  • Two new parameters have been added to the `spectral.settings` object:
  • 1. `START_WX_APP` : If this parameter is True and no wx App exists when a GUI function is called, then an App will be started to prevent an error.
  • `WX_GL_DEPTH_SIZE` : If the default GL_DEPTH_SIZE is not supported by the host system (resulting in a blank GLCanvas in `view_cube` or `view_nd`), this parameter can be reduced (e.g., to 24 or 16) to enable OpenGL rendering.
  • Bug Fixes:
  • Spectral plotting failed when double-clicking a transformed image due to band info being unavailable. A check is now performed to prevent this.
  • OpenGL-related calls will no longer fail if GLUT or an associated font is not available.

New in Spectral Python 0.9 Alpha (Jan 24, 2013)

  • New Features:
  • Added a linear target detector (MatchedFilter).
  • Added a class for linear transformations (LinearTransform).
  • Changes:
  • `principal_components` function now returns a object, which contains return values previously in a tuple, , as well as the associated linear transform, and a `reduce` method.
  • `linear_discriminant` function now returns an object, which contains return values previously in a tuple, as well as the associated linear transform.
  • Covariance calculation is now performed using 64-bit floats.
  • Bug Fixes:
  • Fixed a bug causing `ndwindow` to fail when no class mask is passed as a keyword arg.

New in Spectral Python 0.8 Alpha (Jul 18, 2012)

  • The ndwindow function enables viewing of high-dimensional images in a 3D display. See N-Dimensional Feature Display for details.
  • Hypercube display now uses mouse control for pan/zoom/rotate.
  • Fixed a bug in several deprecation warnings that caused infinite recursion.

New in Spectral Python 0.7 Alpha (Feb 20, 2012)

  • Changes:
  • Changed many function/method names to be more consistent with external
  • packages. Use of most old names will generate a deprecation warning but
  • some will require immediate changes to client code.
  • :func:`spectral.kmeans` runs about 10 times faster now for loaded images.
  • Bug Fixes:
  • The Erdas LAN file interface was modified because the previous reference
  • file had mixed endian between header and data sections. If you are using
  • the old sample file "92AV3C", then start using the "92AV3C.lan" file
  • available on the web site (see Intro section of the user's guide). This file
  • has consistent endian-ness between header and image data sections
  • Fixed a few bugs that potentially caused problems with the BIP and BSQ file
  • interfaces. The specific methods fixed are:
  • BipFile.read_bands
  • BsqFile.read_subregion
  • BsqFile.read_subimage

New in Spectral Python 0.6 Alpha (Feb 20, 2012)

  • New Features:
  • Support for parsing & loading spectra from the ASTER Spectral Library.
  • Ability to save ENVI spectral library files.
  • :meth:`spectral.kmeans` will accept a :exc:`KeyboardInterrupt` exception
  • (i.e., CTRL-C) and return the results as of the previous iteration.
  • Documention is now online via Sphinx.
  • Changes:
  • Major changes to module/sub-module layout. Biggest change is that the top-
  • level module is now "spectral" instead of "Spectra" (capitalization). Many
  • functions/classes have moved between files and sub-modules but that should
  • be transparent to most users since the most obvious names are automatically
  • imported into the top-level module namespace.
  • Additional ENVI data file extensions are now searched (.bil, .bsq, .bip,)
  • Changed default colors in :obj:`spectral.spyColors`, which is the default
  • color palette used by :meth:`spectral.viewIndexed`.
  • :meth:`spectral.transformImage` is now the means to apply a linear transform
  • to an image (rather than creating a :class:`spectral.TransformedImage`
  • directly) because it handles both :class:`spectral.SpyFile` and
  • :class:`numpy.ndarray` objects.
  • bit floats are now used for covariance matrices.
  • Changed SPECTRAL_DATA path delimiter from semi-colon to colon.
  • Bug fixes:
  • Fixed a bug preventing successful reading of ENVI header files where an
  • equal ("=") symbol appears in a parameter value.
  • Fixed bug where a ColorScale might return an incorrect color if the scale
  • contained negative values.
  • :meth:`cluster` would fail if only 2 clusters were requested.
  • :meth:`kmeans` was reporting an incorrect number of pixels reassigned
  • between iterations (did not affect final convergence).
  • :meth:`logDeterminant` was crashing when receiving negative values.
  • Missing a potential byte swap in :meth:`spectral.io.bilfileBilFile.readDatum`.