1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4% Berechnet ein Phasenbild für eine bestimmte Intensitätsverteilung basierend auf dem genetischen Algorithmus
8%Letzte Änderung: 30.11.2022
9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
17inputBeam =
Hologram.beamImage(
Hologram.inputBeam_source, "gauss");%
##gauss ggf. später noch ändern %Auswahl des Eingangsstrahls
24 disp("ERROR - UNKNOWN EVALUATION MODE FOR GENETIC ALGORITHM");
27%Start, Startpopulation
29 %Binäre Zufallsmatrix als Startpopulation erzeugen
31elseif(
Hologram.ga_startPhase=="gerchbergSaxton")
32 %Für jedes Individuum der Population wird der Gerchberg-Saxton
33 %Algorithmus ausgeführt, um das Startbild zu erzeugen
38 %Ab hier Umwandlung des Phasenbildes in eine Binärmatrix
40 startImg = dec2bin(startImg);
41 startImg = permute(startImg, [2,1]);
43 startbit = logical(str2num(startImg));
45 startbit = permute(startbit, [2,3,1]);
46 n0(:,:,:,i) = startbit(:,:,:);
50 %Leere Matrix als Startbild
55konvergenz = single(zeros(
Hologram.ga_iteration,1)); %Speicherplatz reservieren für Fehler
60 r = logical(ceil(rand(size(n0))-1+
Hologram.ga_mutationProb/100)); %Erzeugen einer binären Matrix mit zufällig verteilten einsen an den Stellen, an denen Mutationen stattfinden
61 n0 = xor(n0,r); %Mutation der Popuation mittels logischer Operation
63 %Population wachsen lassen
64 while(size(n0,4)<=
Hologram.ga_population) %Schritt solange wiederholen, bis die Startpopulation überschritten wurde
66 randVector = int16(randperm(size(n0,4)));
67 n1 = n0(:,:,:,randVector);
70 a = n1(:,:,:,1:floor(size(n1,4)/2)); %Aufteilen der Population in "Mütter" und "Väter"
71 b = n1(:,:,:,floor(size(n1,4)/2)+1:2*floor(size(n1,4)/2));
72 maxrand=2^size(a,3)-1;
73 r = int8(randi([0,maxrand],1,size(a,1)*size(a,2)*size(a,4)));%Erstellen einer Zufallsmatrix, die entscheidet, ob das Muttergen oder Vatergen übertragen werden soll
74 r = logical(int2bit(r,size(a,3)));
75 r = reshape(r,size(a,3),size(a,1),size(a,2),size(a,4));
76 r = permute (r,[2 3 1 4]);
78 n0 = (a&(~r))|(b&r); %Zufällig Gen a oder b weitergeben
79 n0= logical(cat(4, n1,n0));
83 %Binärcode in Bild umwandeln
84 img= single(zeros (size(n0,1),size(n0,2),size(n0,4)));
86 %Hier Auswahl Binärecode / Graycode
89 img(:,:,:) = single(img(:,:,:) + 2^(size(n0,3)-q)*reshape(n0(:,:,q,:),[size(n0,1),size(n0,2),size(n0,4)]));
91 elseif (
Hologram.ga_bitCode == "gray")
95 n3= permute(n0,[1 2 4 3]);
98 img=reshape(img,s1,s2,s4);
100 disp("ERROR! Unknown BitCode");
105 if(
Hologram.ga_evaluation == "calculated")
106 %Berechnetes Bild zur Evaluation
107 result = abs(fftshift(fft2(fftshift(abs(inputBeam).*exp(1i*img(:,:,:)/256*2*pi))))); %FFT
108 result_max =
max(
max(result)); %Ergebnis normieren auf Zahlenbereich 0 bis 1
109 result = result./(ones(size(result)).*result_max);
110 evaluation=single(sum(sum(abs((result(:,:,:)-ones(size(result)).*target(:,:)).^2)))); %Vergleich des generierten Bildes mit dem Target
111 evaluation = permute(evaluation,[3,2,1]);
113 %
#Hier beachten, dass Pixel unterschiedlich groß sind!
115 evaluation = zeros(size(n0,4),1);
116 img = single(img./256);
118 SLM.sendImage(transpose(img(:,:,q)));
119 %Gemessenes Bild zur Evaluation
120 beamProfile=
Camera.getImage(); %Camerabild auslesen
121 %
#Hier Bildgröße anpassen
123 result=single(beamProfile);
124 result_max =
max(
max(result));
125 result = result./(ones(size(result)).*result_max); %Normieren des Ergebnis auf den Zahlenbereich von 0 bis 1
126 evaluation(q)=single(sum(sum(abs((result(:,:)-target(:,:)).^2)))); %Vergleich des generierten Bildes mit dem Target
129 disp(
"ERROR - UNKNOWN EVALUATION MODE FOR GENETIC ALGORITHM");
131 evaluation=single(evaluation);
134 [error,ind]=sort(evaluation); %Vektor speichert die Indizes der Bilder in aufsteigender Fehlerreihenfolge
141 if(evalin(
'base',
'Hologram.displayProgress'))
146 konvergenz(i)=single(error(1)); %Abspeichern des Fehlers des besten Bildes der aktuellen Iteration
152img= zeros (size(n0,1),size(n0,2),size(n0,4));
154%Hier Auswahl Binärecode / Graycode
157 img(:,:,:) = img(:,:,:) + 2^(size(n0,3)-i)*reshape(n0(:,:,i,:),[size(n0,1),size(n0,2),size(n0,4)]);
159 elseif (
Hologram.ga_bitCode == "gray")
163 n3= permute(n0,[1 2 4 3]);
166 img=reshape(img,s1,s2,s4);
168 disp("ERROR! Unknown BitCode");
171image = exp(1i*img(:,:,1)/256*2*pi);
176 %Ausgabe des Fehlers über die Iterationen
function Genetic_Algorithm()
Genetischer Algorithmus. Berechnet ein Phasenbild für eine bestimmte Intensitätsverteilung basierend auf dem...
function Gerchberg_Saxton()
Erstellt das Hologramm für den Gerchberg-Saxton-Algorithmus.
function Phase_Image(in image)
Gibt die Phase eines Hologramms als Graustufenmatrix aus.
function Scale_and_ResizeImage(in input, in x, in y, in mode, in pixelPitchInput, in pixelPitchOutput)
Passt ein Bild an eine andere Auflösung an. Zusätzlich zur Funktion "ResizeImage" wird hier die Pixelgröße de...
Property pixelPitch
Pixelgröße in mm.
Hologramme werden als Objekte vom Typ Hologram dargestellt.
Property ga_elite
in % Anteil der Bilder, die für den nächsten Iterationsschritt behalten wird
Property ga_image
Dateipfad zu dem Bild, welches dargestellt werden soll.
Property pixelPitch
Abstand der Pixel.
Property ga_bitCode
'binary', 'gray' Binäre Codierung der Graustufen oder Nutzung des 'Greycode' (Binär ist deutlich schnelle...
Property ga_population
Population = Anzahl der Bilder, die in jedem Schritt getestet werden.
Property pixelX
Auflösung der Berechnung.
Property ga_color
'grayValues' oder 'binary' Konvertierung des darzustelenden Bildes in Graustufen oder Schwarz-Weiß
Property ga_invertColors
Invertierung der Farben.
Property ga_resizeMode
'stretch', 'original', 'repeat' Anpassung des Bildes an die Hologrammauflösung
Property ga_limitGrayLevel
Schwellwert für die Schwarz-Weiß-Konvertierung.
Property ga_evaluation
'calculated' oder 'camera' Auswahl der Methode zur Evaluation der Bilder. Bei 'calculated' wird die I...
Property ga_iteration
Anzahl der Iterationen.
function prepImage(in path, in x, in y, in resizeMode, in color, in limitGrayLevel, in invert)
function setWS(in field, in param, in value)