function [Output] = MF(Image,Library)
% Matched Filter
% Silas J. Leavesley, PhD
% University of South Alabama
% Last Updated: 2/7/2017
% To visualize output data:
% figure(1)
% for i = 1:length(Output.data(1,1,:))
% subplot(1,length(Output.data(1,1,:)),i)
% imagesc(Output.data(:,:,i))
% end
% colormap(gray) % or any other colormap, as desired
tic
Image=double(Image);
[O P] = size(Library);
[L M N]=size(Image);
Image_Reshaped=(reshape(Image,(L*M),N))'; %L M are x y N=# wavelengths
K=L*M; % Total # pixels in image
% Initialize library variable - library gets shifted by 1 endmember each
% time around the loop
Library_shifted = Library;
% Run matched filter for each endmember
for i = 1:P
% Specify desired spectral signature (d)
d = Library_shifted(:,1);
% Remaining endmembers are undersired signatures (U)
U = Library_shifted(:,2:P);
% Define the pseudo-inverse of U
U_pseudo = (inv(transpose(U)*U))*transpose(U);
% Define the rejection operator
I = eye(N);
rejection_operator = (I-(U*U_pseudo));
% Define the filter function
q = transpose(d)*rejection_operator;
% Multiply image by filter function (pixel-by-pixel operation, in
% vectorized form)
for j = 1:K
MF(j,i) = q*Image_Reshaped(:,j);
end
% Shift library to next endmember
Library_shifted = circshift(Library_shifted,[0 -1]);
end
Output.data=reshape(MF,L,M,P);
toc