%% Alles schließen und alte Variablen aus dem Workspace löschen
close all; 
clear all; 
clc;

%% Bild einlesen und Dimensionen auslesen

% Bild einlesen
originalImage = imread('Beispielbild_3.jpg');

% Bild in Schwarz-Weiß-Bild konvertieren
grayImage = rgb2gray(originalImage);

%% Kantenerkennung nach der Prewitt-Methode

% Kantenstärke und Kantenrichtung nach der Prewitt-Methode bestimmen
[kantenStaerke_prewitt, kantenRichtung_prewitt] = imgradient(grayImage,'Prewitt');

% Konvertierung der Kantenstärke vom double-Format in das uint8-Format
kantenStaerke_prewitt = uint8(kantenStaerke_prewitt);

% Konvertierung der Kantenrichtung vom double-Format in das uint8-Format
kantenRichtung_prewitt = uint8(kantenRichtung_prewitt);

% Binäres Bild (mit ausschließlich schwarzen und weißen Pixeln) erstellen
binaryImageKantenStaerke_prewitt = ~im2bw(kantenStaerke_prewitt, 0.08);


%% bwareaopen wird angewandt zum Entfernen kleiner Objekte aus dem binären Bild

% Entfernt Objekte, welche aus weniger als 50 Pixeln bestehen
binaryImageKantenStaerke_prewitt = bwareaopen(binaryImageKantenStaerke_prewitt, 1000);

%% Kantenerkennung nach der sobel-Methode

% Kantenstärke und Kantenrichtung nach der Prewitt-Methode bestimmen
[kantenStaerke_sobel, kantenRichtung_sobel] = imgradient(grayImage,'Prewitt');

% Konvertierung der Kantenstärke vom double-Format in das uint8-Format
kantenStaerke_sobel = uint8(kantenStaerke_sobel);

% Konvertierung der Kantenrichtung vom double-Format in das uint8-Format
kantenRichtung_sobel = uint8(kantenRichtung_sobel);

% Binäres Bild (mit ausschließlich schwarzen und weißen Pixeln) erstellen
binaryImageKantenStaerke_sobel = im2bw(kantenStaerke_sobel, 0.08);


%% Bilder darstellen: Original <-> Prewitt

% Figure erstellen
figure

% Plot original Bild
subplot(2,2,1);
imshow(originalImage);
title('Original Image')

% Plot schwarz-weiß Bild
subplot(2,2,2);
imshow(grayImage);
title('Gray Image')

% Plot Kantenstärke nach der Prewitt-Methode 
subplot(2,2,3);
imshow(kantenStaerke_prewitt);
title('Kantenstärke nach der Prewitt-Methode')

% Plot des binären Bilds der Kantenstärke
subplot(2,2,4);
imshow(binaryImageKantenStaerke_prewitt);
title('binäres Bild der Kantenstärke')

%% Bilder darstellen: Sobel <-> Prewitt
%{
% Figure erstellen
figure

% Plot Kantenstärke nach der Sobel-Methode 
subplot(2,2,1);
imshow(kantenStaerke_sobel);
title('Kantenstärke nach der Sobel-Methode')

% Plot des binären Bilds der Kantenstärke
subplot(2,2,2);
imshow(binaryImageKantenStaerke_sobel);
title('binäres Bild der Kantenstärke nach der Sobel-Methode')

% Plot Kantenstärke nach der Prewitt-Methode 
subplot(2,2,3);
imshow(kantenStaerke_prewitt);
title('Kantenstärke nach der Prewitt-Methode')

% Plot des binären Bilds der Kantenstärke
subplot(2,2,4);
imshow(binaryImageKantenStaerke_prewitt);
title('binäres Bild der Kantenstärke nach der Prewitt-Methode')
%}

%% Erodieren des Bildes

% Erzeugen eines morphologisches Strukturelements (Filtermaske)
se = strel('diamond',2);

sb = strel('disk',5);

% Erosion mit dem erzeugten morphologischen Strukturelement durchführen
erodedImage = imerode(binaryImageKantenStaerke_prewitt,se);

imOpenImage = imopen(binaryImageKantenStaerke_prewitt, sb);

% Plotten des erodierten Bildes in neuer Figure
figure

% Plot des binären Bilds der Kantenstärke
subplot(2,2,1);
imshow(binaryImageKantenStaerke_prewitt);
title('binäres Bild der Kantenstärke')

% Plot des Bildes, nach Durchführung der Erosion
subplot(2,2,2);
imshow(erodedImage);
title('binäres Bild der Kantenstärke nach Erosion')

subplot(2,2,3);
imshow(imOpenImage);
title('binäres Bild der Kantenstärke nach imopen')

% Kanten im Bild berechnen
%{
[B,L] = bwboundaries(erodedImage,'noholes');
for i = 1:length(B)
    if size(B{i}) <=10000
        B{i} = [];
    end   
end
% Leere Zellen finden
e = cellfun('isempty', B);  
% Leere Zellen löschen
B(e) = [];
figure
imshow(erodedImage);
hold on
for k = 1:length(B)
   boundary = B{k};
   plot(boundary(:,2), boundary(:,1), 'g', 'LineWidth', 2)
end
%}