function T = transforma( I,A )
%TRANSFORMA Aplica la matriz de transformación A a la imagen I.
%   T = transforma( I,A )
%   Imagen T del mismo tamaño que I
%   Emplea transf.inversa y vecino más próximo.
%
%   Ejemplo:  
%          I = imread('caja01.bmp'); 
%          A=[0.5 0 0; 0 0.5 0; 0 0 1];                                            %
%          T=transforma(I, A);     
%          imshow(T);                         

%_________________________________________________________________________%
% NOMBRE DEL FICHERO:   transforma.m                                      %
% RECIBE:   Imagen de niveles de gris I                                   %
% DEVUELVE: La misma imagen rotada angulo grados, de igual tamaño que I.  %
% ALGORITMO EMPLEADO: Transformación INVERSA. Interp.vecino más prox.     %                      
% VARIABLES:   I = imagen en niveles de gris a transformar                %
%              T = imagen  resultante                                     %
%              filas = numero de filas de I                               %
%              columnas = numero de columnas de I                         %
%              ient = fila en la imag.de entrada correspond.a pixel T(i,j)% 
%              jent = colum en  imag. de entrada correspond.a pixel T(i,j)%
% BUGS:                                                                   %
% SUPOSICIONES : La imagen de salida es del mismo tamaño.                 %                   
%                Puede perderse una parte significativa de la imagen      %
% LIBRO  VISION ARTIFICIAL INDUSTRIAL. UNIVERSIDAD DE VALLADOLID 2012     %
% TEMA 3 MANIPULACIÓN GEOMÉTRICA DE LA IMAGEN.  pág 50                    %
% AUTORES: Eusebio de la Fuente y Félix Miguel Trespaderne                %
%_________________________________________________________________________%
%  Ejemplo de ejecucion:                                                  %
% >> I = imread('caja01.bmp');                                            %
% >> R=[0.707 -.707 0; 0.707 .707 0; 0 0 1]; %rotacion 45 grados          %
% >> T=transforma(I, R);                                                  %
%_________________________________________________________________________%
% Con funciones de matlab
% >> I = imread('caja01.bmp');                                            %
% >> R=[0.707 -.707 0; 0.707 .707 0; 0 0 1]; %rotacion 45 grados          %
% >> tR = maketform('affine',R'); 
% >> T = imtransform(I,tR);                                               %
% >> imshow(T);                                                           %
%_________________________________________________________________________%

[filas,columnas]=size(I);
%T matriz donde guardaremos la imagen transformada. Por simplicidad se hace
%del mismo tamaño pero lo suyo era calcular el tamaño previamente para que
%no se pierda información
T = zeros(filas,columnas);

for i=1:filas         
    for j=1:columnas  
        Pt = [i,j,1]'; %Pt coord homog. pixel imag trasnf
        %Po coord homog. pixel imag entrada..
        Po=A\Pt; % A\Pt es lo mismo que inv(A)*Pt (aplicamos transf.inversa)     
        ient=Po(1);
        jent=Po(2);
                     
        %comprobamos que Po cae dentro de la imagen
        if(ient>=1 && ient<=filas && jent>=1 && jent<=columnas)
            %Vecino más próximo: redondeo al entero más cercano
            T(i,j) = I(round(ient),round(jent));
        end
    end
end
T=mat2gray(T);  
end

