// ==================================================================== // This file is part of the Endmember Induction Algorithms Toolbox for SCILAB // 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_ATGP(data,p) //// [E,C] = EIA_ATGP(data,p) // // 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. // Copyright (2007) GRNPS group @ University of Extremadura, Spain. // // ATGP endmembers induction algorithm. // ------------------------------------------------------------------------------ // Input: data : column data matrix [nvariables x nsamples] // p : number of endmembers to be induced (positive integer > 0) // // Output: E : set of induced endmembers [nvariables x p] // C : induced endmembers indexes vector [nsamples] with {0,1} values, where '1' indicates that the corresponding sample has been identified as an endmember. // // 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. //// Arguments [lhs,rhs]=argn(0); if lhs < 1 error('Insuficient parameters'); end if lhs < 2 p = EIA_HFC(data,10^(-5)); end if p <= 0 p = EIA_HFC(data,10^(-5)); end //// data size [nvariables,nsamples] = size(data); //// Algorithm initialization // the sample with max energy is selected as the initial endmember max_energy = -1; idx = 0; for i = 1:nsamples r = data(:,i); val = r'*r; if val > max_energy max_energy = val; idx = i; end end e_0 = data(:,idx); // Initialization of the set of endmembers and the endmembers index vector E = zeros(nvariables,p); E(:,1) = e_0; C = zeros(1,nsamples); C(idx) = 1; // Generate the identity matrix. I = eye(nvariables,nvariables); //// Algorithm for i = 1:p-1 UC = E(:,1:i); // Calculate the orthogonal projection with respect to the pixels at present chosen. // This part can be replaced with any other distance PU = I-UC*pinv(UC'*UC)*UC'; max_energy = -1; idx = 0; // Calculate the most different pixel from the already selected ones according to // the orthogonal projection (or any other distance selected) for j = 1:nsamples r = data(:,j); result = PU*r; val = result'*result; if (val > max_energy) max_energy = val; idx = j; end end // The next chosen pixel is the most different from the already chosen ones e_i = data(:,idx); E(:,i+1) = e_i; C(idx) = 1; end endfunction