% _____________________________________________________
%
% -----------------------------------
% ---- BV-Uebung-03 / Aufg. 3.1 -----
% -----------------------------------
% 
% Matthias Enders   
% Michael Gerlich   
% Danny Misiak      
% Thomas Schmutzer  
%
% Skript zur Realisierung der Erosion auf einem Binaerbild.
% Die zum Objekt gehoerenden Pixel haben den Binaerwert 1,
% Pixel des Hintergrundes haben des Binaerwert 0.
% 
% Eingegeben werden der Pfad zum Binaerbild und zum
% strukturierenden Element, sowie die Postition des
% Referenzpixel im struk. Element.
%
% Da es moeglich ist, dass ein Objekt am Rand des Bildes liegt und dies
% dann dazu fuehren kann, dass ein Objekt bei der Dilatation evtl.
% vergroessert wir und dies nicht sichtbar ist, wird um das Bild ein Rand
% in der Groesse des strukt. Elementes gelegt.
% Die Pixel des Randes haben dem Binaerwert 0.
% Das strukt. Element laeuft von Pos. (1,1) durch das Binaerbild.
%
% Das strukt. Element besteht aus einer Matrix die mit 0en und 1en
% gefuellt ist, nur die 1-Pixel spielen eine Rolle bei der
% morpholog. Operation.
% Das strukt. element ist z.B. in einer Textdatei als Matrix abzulegen,
% fuer das unten stehende Beispiel in der Form
% 
%   1  1  1
%   1  1  1
%   1  1  0
% 
% Das Referenzpixel ist bei der Dilatation so anzugeben, dass es schon
% auf die Position nach der Rotation zutrifft, es findet also keine
% Rotation um den Ursprung im Programm statt !
% 
% 
% Bsp:
% 
%   Name des Bildes: test.png
%   Name des strukt. Elementes: s1.txt  (z.B. nicht quadratisch)
%                                                 ___ ___ ___
%   Referenzpixel in (2,2)                       |___|___|___|
%                                        -->     |___|_x_|___|
%                                                |___|___|
% 
% Somit lautet der Skriptaufruf wie folgt:
%  
%   erosion(B,S,x,y), (x,y = Koord. des Referenzpixels)
% 
%   ---> erosion('test.png','s1.txt',2,2)
%   
% _____________________________________________________
%

function dilatation(bild,elem,x,y)
  disp('                                   ');
  disp('-----------------------------------');
  disp('---- BV-Uebung-03 / Aufg. 3.1 -----');
  disp('-----------------------------------');
  disp('                                   ');
  % >>>>>>> Einlesen des Binaerbildes <<<<<<<
  B_org = imread(bild); %-> Einlesen des Orginalbildes
  sprintf('-- strukt. Element "%s"', elem)
  S = load(elem) %-> Einlesen des strukt. Elementes
  [h_org,w_org] = size(B_org); %-> Bestimmen der Hoehe und Breite des Bildes
  [n,m] = size(S);
  
  h = h_org+(2*n);
  w = w_org+(2*m);
  V = zeros(h,w); %-> Intitial. der spaeteren Ergebnismatrix
  B = zeros(h,w); %-> Intitial. des neuen Bildes mit Rand
  sprintf('-- Bild "%s" in Binaerdarstellung mit hinzugefuegtem Rand', bild)
  B(n+1:n+h_org, m+1:m+w_org) = B_org %-> Rand um org. Bild in Abh. vom strukt. Element
  s = sum(sum(S)); %-> bei Dilatation muss strukt. Element nicht vollst. enthalten sein,
                   %   Berechnung der Summe aller 1-Pixel des strukt. Elementes
  n = n-1; %-> Parameter anpassen, da Indizierung bei 1 beginnt
  m = m-1;
  x = x-1;
  y = y-1;
  %-> Bei der Dilatation muss das strukt. Elem. nicht vollstaendig enthalten
  %   sein, es wird punktweise mit der Teilmatrix des Bildes multipliziert.
  %   In jeder Zeile und Spalte wird strukt. Element weitergeschoben
  %   und geschaut ob die Summe der enthaltenen 1-Pixel groesser
  %   als 0 ist (mind. ein 1-Pixel muss enthalten sein),
  %   wenn ja wird Koordinate der Ergebnismatrix auf 1 gesetzt,
  %   verschoben um Pos. des Referenzpixels im strukt. Elem.
  for i = 1:h-n
    for j = 1:w-m
      if(sum(sum(B(i:i+n,j:j+m).*S)) > 0)
        V(i+x,j+y)= 1;
      end
    end
  end
  %-> Ausgabe der Ergebnismatrix
  sprintf('-- Ergebnis der Dilatation auf Bild B (mit Rand) mit dem strukt. Element aus file "%s"', elem)
  V
  figure(1)
    imshow(B,[]) %-> Anzeigen des Orginalbildes mit Rand
  figure(2)
    imshow(V,[]) %-> Anzeigen des Ergebnisbildes
    
  %   Am Besten die Figuren nach dem ersten durchlauf an das Matlabfenster
  %   andocken und dann nochmal starten, dann wird die Groesse auch etwas
  %   skaliert und man erkennt auch was :)
  
end
