function [ CA_Objekt,background_th ] = object_detection( M_Input )
%% Objekterkennung

%% Ascii-File der LumiCam einlesen
%M_Ascii = load_ascii;                 %M_Ascii=Matrix der Leuchtidchtewerte aus dem Ascii-File der LumiCam
%M_Ascii = load_ascii_alt;

%% Bild wird als binäres Bild (in Schwarz(0) und Weis(1)) dargestellt
background_th = graythresh(M_Input);    % Berechnung des Grenzwertes zwischen Vorder- und Hintergrund
M_BW = im2bw(M_Input,background_th);    % Erstellen eines Schwarz(0)-/Weis(1)-Bildes

%% "Objekte die kleiner SE sind werden rausgefiltert
SE = strel('disk',2);   %Erstellt eine "Scheibe" als Struktur-Element mit dem Radius von 2 Pixeln
M_BW_SE = imopen(M_BW,SE);  %Löscht "Objekte die kleiner als SE sind

%% Darstellung nach Umrechnung in SW mit level=grenzwert für Vorder-/Hintergrund
figure;
    %subplot(1,2,1);
    imshow(M_BW);
        title('M-BW');
        ylabel('Zeile');
        xlabel('Spalte');
        axis on;
        %grid on;

figure;        
    %subplot(1,2,2);
    imshow(M_BW_SE);
        title('M-BW-SE');
        ylabel('Zeile');
        xlabel('Spalte');
        axis on;
        %grid on;
figure_vergleich = gcf;
        
%%
%[M_BW_conncomp] = bwconncomp(M_BW_SE,4);   % bwconncomp ermittelt connected components der Matrix M_BW_SE mit einer mindestanzahl an 4 Pixeln. Jeder component wird ein wert(1,2,..) zugewiesen
[M_BW_conncomp,num_comp] = bwlabel(M_BW_SE,4);  % bwlabel ermittelt connected components der Matrix M_BW_SE mit einer mindestanzahl an 4 Pixeln. Jeder component wird ein wert(1,2,..) zugewiesen

%%
stats = regionprops(M_BW_conncomp,'Eccentricity','Area','BoundingBox');

%% Erstellen eines Cell-Arrays in dem die einzelnen Objekte(als Matrix) gespeichert werden
CA_Objekt = cell(num_comp,1);

%%
% Schleife für jedes Objekt(component), ermittelt die Lage der einzelnen
% Objekte und extrahiert diese ein eigenen Bilder
for n = 1:num_comp
    [row,col] = find(M_BW_conncomp == n);   %Liest die Zeile und Reihe jedes Elements eines Objekts aus
    hight = max(row) - min(row) + 1;    %Berechnet die Höhes des Objekts (als Rechteckig gedacht)
    width = max(col) - min(col) + 1;    %Berechnet die Weite des Objekts (als Rechteckig gedacht)
    target = double(zeros([hight,width]));   %Erstellt eine Matrix (target) aus "0" mit der Ermittelten Höhe und Weite
    sy = min(col) - 1;  %Versatz zum Ursprung der Matrix; -1, da Ursprung 1 ist und nicht 0
    sx = min(row) - 1;  %Versatz zum Ursprung der Matrix; -1, da Ursprung 1 ist und nicht 0
    
    % Schleife, die den Wert jedes Elements (für das jeweilige Objekt) aus
    % M_Ascii ausliest und in die Matrix (target) die der reinen
    % Objektgröße entspricht geschrieben werden
    for i = 1:size(row,1)
        x = row(i,1) - sx;  %Offset für unterschiedliche Matrixgröße
        y = col(i,1) - sy;  %Offset für unterschiedliche Matrixgröße
        target(x,y) = M_Input(row(i,1),col(i,1));
    end
    
    % Speichern des jeweiligen fertigen Objektes in ein Cell-Array
    CA_Objekt{n,1} = target;
    
    % Gibt das jeweilige Objekt(target) als Bild aus
    mytitle = strcat('Object: ',num2str(n));
    figure,imagesc(target);
        title(mytitle);
        axis on;
        grid on;
        colorbar;
    
    CA_Objekt{n,2} = gcf;  %figure-nummer des jeweiligen Objekts wird in CA_Objekte hinterlegt  
        
    % Das jeweilige Objekt wird im Ausgangsbild durch einen rechteckigen
    % Rahmen um das Objekt und Namen markiert
    figure(figure_vergleich);
        %subplot(1,2,2);
        hold on
        %Rechteck um das jeweilige Objekt
        box = rectangle('Position',stats(n).BoundingBox,'LineWidth',2);
        set(box,'EdgeColor',[0 0.75 0]);
        %Text zum jeweiligen Objekt
        x_text = stats(n).BoundingBox(1,1); %X-Position
        y_text = stats(n).BoundingBox(1,2) - 20;    %Y-Position
        text_feld = text(x_text,y_text,mytitle,'FontSize',6,'Color',[0.75 0 0],'EdgeColor',[0 0.75 0],'LineWidth',2,...
            'BackgroundColor',[0 .75 .3]);
        %http://stackoverflow.com/questions/13232341/make-background-of-annotation-box-in-image-semi-transparent
%         hP = patch(x_text,y_text, 'white', 'EdgeColor', 'none', 'FaceColor', 'white',...
%         'alpha', 0.3);
%         uistack(hA, 'top');
        hold off

end



end

