% APRENDIZAJE AUTOMÁTICO (G. Pajares y J. M. de la Cruz, Eds.)
% Editorial: RA-MA
% Capítulo 11: Razonamiento Basado en Casos
% Autores: Ángela Ribeiro, Xavier P. Burgos Artizzu y Jesús M. Conesa Muñoz

% Ciclo CBR completo sobre una imagen de entrada (caso nuevo)
function [imagen_recuperada, procesamiento_usado, mh] =  procesaImagenCBR(entrada)

% Lectura de la imagen de disco
im = imread(entrada);
im = im2single(im);
im = imresize(im, [1024 768]);

%INDEXACIÓN
% Se calculan los atributos característicos que categorizan la imagen de
% entrada
[soleado,estadoCrec,errorSembrado,plagado] = indexa(im);

%RECUPERACIÓN
% Se recupera de la Base de Casos la imagen más similar (de la misma clase
% que la imagen de entrada)
[segm,elim,filt,param,imagen_recuperada, sim] = recupera(im, soleado, estadoCrec, errorSembrado, plagado);

%REUTILIZACIÓN
%Se reutiliza el procesamiento del caso recuperado para procesar el caso
% nuevo
[ims,ime,imr,mh] = plataforma(im,segm,elim,filt,param);

%APRENDIZAJE
%Si la similitud entre el caso nuevo y el caso recuperado es inferior al
% 70% se almacena el caso nuevo en la Base de Casos
if(sim<0.7)
    load BC
    
    % Se añade al final de la Tabla
    pos = length(BC)+1;
    
    %Se rellenan los datos
    BC{pos,1} = pos;
    BC{pos,2} = [entrada];	
    BC{pos,3} = soleado;	
    BC{pos,4} = estadoCrec;	
    BC{pos,5} = errorSembrado;	
    BC{pos,6} = plagado;	
    BC{pos,7} = segm;	
    BC{pos,8} = elim;	
    BC{pos,9} = filt;	
    %PARÁMETROS PROCESAMIENTO
    cont = 1;
    if(segm==1)
        BC{pos,10}=param(1:4);
        cont = 5;
    else
        BC{pos,10}=param(1:5);
        cont = 6;
    end;
    if(elim==1)
        BC{pos,11}=param(cont);
        cont = cont+1;
        
    elseif(elim==2)
        BC{pos,11}=param(cont:cont+1);
        cont = cont+2;
    else
        BC{pos,11}=param(cont:cont+2);
        cont = cont+3;
    end;
    BC{pos,12}=param(cont);   
    
    save('BC.mat','BC');
end;

%SALIDA
% se devuelve el procesamiento seleccionado por el CBR
procesamiento_usado = [segm,elim,filt+1,param];

% VENTANA DE RESULTADOS
% utiliza la Interfaz Gráfica de Usuario creada
sol = 'Falso';
if(soleado) sol = 'Verdadero';
end;

plaga = 'Falso';
if(plagado) plaga = 'Verdadero';
end;

errors = 'Falso';
if(errorSembrado) errors = 'Verdadero';
end;

estadoC = 'Bajo';
if(estadoCrec==2) estadoC = 'Medio';
elseif(estadoCrec==1) estadoC = 'alto';
end;

indexacion = ['Soleado: ' sol '           Estado de crecimiento: ' estadoC '           Error de sembrado: ' errors '           Infestación: ' plaga];

recuperacion = ['     Id caso recuperado: ' num2str(imagen_recuperada) '                     Similitud: ' num2str(sim)];

procesamiento = ['Método Segmentación: S' num2str(segm) '    Método Eliminación: E' num2str(elim) '    Método Filtrado: F' num2str(filt+1) '    Parámetros: '];

for i=1:length(param)
    procesamiento = [procesamiento '    ' num2str(param(i))];
end;

gui(indexacion,recuperacion,procesamiento,mh,im,ims,ime,imr)