// ====================================================================
// This file is part of the Endmember Induction Algorithms Toolbox for MATLAB
// Copyright (C) Grupo de Inteligencia Computacional, Universidad del
// País Vasco (UPV/EHU), Spain, released under the terms of the GNU
// General Public License.
//
// Endmember Induction Algorithms Toolbox is free software: you can redistribute
// it and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// Endmember Induction Algorithms Toolbox is distributed in the hope that it will
// be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Endmember Induction Algorithms Toolbox.
// If not, see .
// ====================================================================
function [E,C] = EIA_2D(data,algorithm,varargin)
//// [E,C] = EIA_2D(data,algorithm,varargin)
//
// Manuel Grana
// Miguel Angel Veganzones
// Grupo de Inteligencia Computacional (GIC), Universidad del Pais Vasco /
// Euskal Herriko Unibertsitatea (UPV/EHU)
// http://www.ehu.es/computationalintelligence
//
// Copyright (2011) Grupo de Inteligencia Computacional @ Universidad del Pais Vasco, Spain.
//
// Endmembers induction algorithms for 2-spatial dimensionality data.
// 2-spatial data is defined as a cube where first dimension represents
// the spectral information and, second and third dimensions are the spatial ones.
// Examples of 2-spatial data are images where each pixel (spatial dimensionality)
// is an N-dimensional feature vector (spectral dimensionality). For
// binaries or grey-scale images N==1. For RGB images N==3. For
// hyperspectral images N is high.
// ------------------------------------------------------------------------------
// Input: data : column data cube [nvariables x nrows x ncolumns]
// algorithm : EIA to be used. It can be one of this:
// {'ILSIA'(default)|'EIHA'|'WM'|'NFINDR'|'FIPPI'|'ATGP'}
// varargin : options to be passed to the algorithm (see below).
//
// Output: E : set of induced endmembers [nvariables x p]
// C : induced endmembers indexes vector [nrows x ncolumns] with {0,1}
// values, where '1' indicates that the corresponding sample
// has been identified as an endmember. Some of the
// algorithms do not select pixels as the endmembers
// and, in that case C is empty.
//
// Now, a description of the algorithms is offered together to the options
// that can be passed as parameters.
//
// * ILSIA: Incremental lattice Source Induction Algorithm (ILSIA) endmembers induction algorithm.
// - Bibliographical references:
// [1] M. Graña, D. Chyzhyk, M. García-Sebastián, y C. Hernández, “Lattice independent component analysis for functional magnetic resonance imaging”, Information Sciences, vol. 181, nº. 10, págs. 1910-1928, May. 2011.
// - Options: {'alpha'}
// 'alpha': Chebyshev-best approximation tolerance threshold (>= 0). Default = 0.
//
// * EIHA: Endmember induction heuristic algorithm (EIHA) endmembers induction algorithm.
// - Bibliographical references:
// [1] M. Grana, I. Villaverde, J. O. Maldonado, y C. Hernandez, «Two lattice computing approaches for the unsupervised segmentation of hyperspectral images», Neurocomput., vol. 72, nº. 10-12, págs. 2111-2120, 2009.
// - Options: {'alpha'}
// 'alpha': perturbation tolerance. Default = 2.
//
// * WM: Prof. Ritter's WM endmembers induction algorithm.
// - Bibliographical references:
// [1] G. X. Ritter y G. Urcid, “A lattice matrix method for hyperspectral image unmixing”, Information Sciences, vol. In Press, Corrected Proof, Oct. 2010.
// - Options: none.
//
// * NFINDR: N-FINDR endmembers induction algorithm.
// - Bibliographical references:
// [1] Winter, M. E., «N-FINDR: an algorithm for fast autonomous spectral end-member determination in hyperspectral data», presented at the Imaging Spectrometry V, Denver, CO, USA, 1999, vol. 3753, págs. 266-275.
// - Options: {'p'|'maxit'}
// 'p': number of endmembers to be induced. If not provided it is calculated by HFC method with tol=10^(-5).
// 'maxit': maximum number of iterations. Default = 3*p.
//
// * FIPPI: Fast Iterative Pixel Purity Index (FIPPI) endmembers induction algorithm.
// - Bibliographical references:
// [1] Chang, C.-I., “A fast iterative algorithm for implementation of pixel purity index”, Geoscience and Remote Sensing Letters, IEEE, vol. 3, nº. 1, págs. 63-67, 2006.
// - Options: {'alpha'}
// 'p': number of endmembers to be induced. If not provided it is calculated by HFC method with tol=10^(-5).
// 'maxit': maximum number of iterations. Default = 3*p.
//
// * ATGP: ATGP endmembers induction algorithm.
// - Bibliographical references:
// [1] A. Plaza y C.-I. Chang, “Impact of Initialization on Design of Endmember Extraction Algorithms”, Geoscience and Remote Sensing, IEEE Transactions on, vol. 44, nº. 11, págs. 3397-3407, 2006.
// - Options: {'p'}
// 'p': number of endmembers to be induced. If not provided it is calculated by HFC method with tol=10^(-5).
//
//// Reshape data
[p m n] = size(data);
data = reshape(data,p,m*n);
//// Algorithms
[lhs,rhs]=argn(0);
select lower(algorithm)
case 'eiha' then
disp('EIHA algorithm');
if rhs > 0
alpha = [];
for i=1:2:rhs
if strcmpi(varargin(i),'alpha')
alpha = varargin(i+1);
break;
end
end
[E,C] = EIA_EIHA(data,alpha);
else
[E,C] = EIA_EIHA(data);
end
case 'wm' then
disp('WM algorithm');
[E] = EIA_WM(data);
C = [];
case 'nfindr' then
disp('N-FINDR algorithm');
if rhs > 0
p = []; maxit = [];
for i=1:2:rhs
if strcmpi(varargin(i),'p')
p = varargin(i+1);
elseif strcmpi(varargin(i),'maxit')
maxit = varargin(i+1);
end
end
[E,C] = EIA_NFINDR(data,p,maxit);
else
[E,C] = EIA_NFINDR(data);
end
case 'fippi' then
disp('FIPPI algorithm');
if rhs > 0
p = []; maxit = [];
for i=1:2:rhs
if strcmpi(varargin(i),'p')
p = varargin(i+1);
elseif strcmpi(varargin(i),'maxit')
maxit = varargin(i+1);
end
end
[E,C] = EIA_FIPPI(data,p,maxit);
else
[E,C] = EIA_FIPPI(data);
end
case 'atgp' then
disp('ATGP algorithm');
if rhs > 0
p = []; maxit = [];
for i=1:2:rhs
if strcmpi(varargin(i),'p')
p = varargin(i+1);
elseif strcmpi(varargin(i),'maxit')
maxit = varargin(i+1);
end
end
[E,C] = EIA_ATGP(data,p,maxit);
else
[E,C] = EIA_ATGP(data);
end
else // ILSIA
disp('ILSIA algorithm');
if rhs > 0
alpha = [];
for i=1:2:rhs
if strcmpi(varargin(i),'alpha')
alpha = varargin(i+1);
break;
end
end
[E,C] = EIA_ILSIA(data,alpha);
else
[E,C] = EIA_ILSIA(data);
end
end
//// Reshape C
if size(C) > 0
C = reshape(c,p,m,n);
end
endfunction