LAT Hologramm-Software 2.0
Loading...
Searching...
No Matches
Genetic_Algorithm.m
Go to the documentation of this file.
1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2% Funktion
3%
4% Berechnet ein Phasenbild für eine bestimmte Intensitätsverteilung basierend auf dem genetischen Algorithmus
5%
6%
7%Autor: Jan Marx
8%Letzte Änderung: 30.11.2022
9%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10
11function [image] = Genetic_Algorithm()
12
13Hologram = evalin('base', 'Hologram');
14SLM = evalin('base', 'SLM');
15Camera = evalin('base', 'Camera');
16
17inputBeam = Hologram.beamImage(Hologram.inputBeam_source, "gauss");%##gauss ggf. später noch ändern %Auswahl des Eingangsstrahls
18
19if(Hologram.ga_evaluation == "calculated")
21elseif(Hologram.ga_evaluation == "camera")
22 target = transpose(single(prepImage(Hologram.ga_image,Camera.pixelX,Camera.pixelY, Hologram.ga_resizeMode, Hologram.ga_color, Hologram.ga_limitGrayLevel, Hologram.ga_invertColors)));
23else
24 disp("ERROR - UNKNOWN EVALUATION MODE FOR GENETIC ALGORITHM");
25end
26
27%Start, Startpopulation
28if(Hologram.ga_startPhase=="random")
29 %Binäre Zufallsmatrix als Startpopulation erzeugen
30 n0 = logical(round(rand(Hologram.pixelX,Hologram.pixelY,Hologram.ga_imageDepth,Hologram.ga_population)));
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
34 n0 = zeros(Hologram.pixelX,Hologram.pixelY,Hologram.ga_imageDepth,Hologram.ga_population);
35 Hologram.gs_image=Hologram.ga_image;
36 for i=1:Hologram.ga_population
37 startImg = round(transpose(Phase_Image(Gerchberg_Saxton())).*255);
38 %Ab hier Umwandlung des Phasenbildes in eine Binärmatrix
39 startImg = reshape(startImg,Hologram.pixelX*Hologram.pixelY,1);
40 startImg = dec2bin(startImg);
41 startImg = permute(startImg, [2,1]);
42 startImg = reshape(startImg,Hologram.pixelX*Hologram.pixelY*Hologram.ga_imageDepth,1);
43 startbit = logical(str2num(startImg));
44 startbit = reshape(startbit,Hologram.ga_imageDepth,Hologram.pixelX,Hologram.pixelY);
45 startbit = permute(startbit, [2,3,1]);
46 n0(:,:,:,i) = startbit(:,:,:);
47
48 end
49else
50 %Leere Matrix als Startbild
51 n0 = zeros(Hologram.pixelX,Hologram.pixelY,Hologram.ga_imageDepth,Hologram.ga_population);
52end
53%Iteration
54
55konvergenz = single(zeros(Hologram.ga_iteration,1)); %Speicherplatz reservieren für Fehler
56tic %Timer starten
57for i=1:1:Hologram.ga_iteration
58
59 %Mutation
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
62
63 %Population wachsen lassen
64 while(size(n0,4)<=Hologram.ga_population) %Schritt solange wiederholen, bis die Startpopulation überschritten wurde
65 %Zufällig sortieren
66 randVector = int16(randperm(size(n0,4)));
67 n1 = n0(:,:,:,randVector);
68
69 %Crossover --> 1,5p
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]);
77
78 n0 = (a&(~r))|(b&r); %Zufällig Gen a oder b weitergeben
79 n0= logical(cat(4, n1,n0));
80 end
81
82 %Bewertung
83 %Binärcode in Bild umwandeln
84 img= single(zeros (size(n0,1),size(n0,2),size(n0,4)));
85
86 %Hier Auswahl Binärecode / Graycode
87 if(Hologram.ga_bitCode == "binary")
88 for q=1:size(n0,3)
89 img(:,:,:) = single(img(:,:,:) + 2^(size(n0,3)-q)*reshape(n0(:,:,q,:),[size(n0,1),size(n0,2),size(n0,4)]));
90 end
91 elseif (Hologram.ga_bitCode == "gray")
92 s1=size(n0,1);
93 s2=size(n0,2);
94 s4=size(n0,4);
95 n3= permute(n0,[1 2 4 3]);
96 n3=reshape(n3,[],8);
97 img=gc2dec(n3);
98 img=reshape(img,s1,s2,s4);
99 else
100 disp("ERROR! Unknown BitCode");
101 end
102
103
104 %Fehler berechnen
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]);
112
113 %#Hier beachten, dass Pixel unterschiedlich groß sind!
114 elseif(Hologram.ga_evaluation == "camera")
115 evaluation = zeros(size(n0,4),1);
116 img = single(img./256);
117 for q=1:size(n0,4)
118 SLM.sendImage(transpose(img(:,:,q)));
119 %Gemessenes Bild zur Evaluation
120 beamProfile=Camera.getImage(); %Camerabild auslesen
121 %#Hier Bildgröße anpassen
122 %result = Scale_and_ResizeImage(single(beamProfile), Hologram.pixelX,Hologram.pixelY,'original', Camera.pixelPitch, Hologram.pixelPitch);
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
127 end
128 else
129 disp("ERROR - UNKNOWN EVALUATION MODE FOR GENETIC ALGORITHM");
130 end
131 evaluation=single(evaluation);
132
133 %Sortieren
134 [error,ind]=sort(evaluation); %Vektor speichert die Indizes der Bilder in aufsteigender Fehlerreihenfolge
135 n1=n0(:,:,:,ind);
136
137 %Selektion --> 1p
138 n0 = n1(:,:,:,1:round(Hologram.ga_population*(Hologram.ga_elite/100))); %Abschneiden der Population an der Selektionsgrenze
139
140 %Zwischenausgabe
141 if(evalin('base','Hologram.displayProgress'))
142 if(mod(i/Hologram.ga_iteration*100,10)==0)
143 disp(strcat(string(i/Hologram.ga_iteration*100),"%"));
144 end
145 end
146 konvergenz(i)=single(error(1)); %Abspeichern des Fehlers des besten Bildes der aktuellen Iteration
147
148end
149
150
151%Ergebnis
152img= zeros (size(n0,1),size(n0,2),size(n0,4));
153
154%Hier Auswahl Binärecode / Graycode
155 if(Hologram.ga_bitCode == "binary")
156 for i=1:size(n0,3)
157 img(:,:,:) = img(:,:,:) + 2^(size(n0,3)-i)*reshape(n0(:,:,i,:),[size(n0,1),size(n0,2),size(n0,4)]);
158 end
159 elseif (Hologram.ga_bitCode == "gray")
160 s1=size(n0,1);
161 s2=size(n0,2);
162 s4=size(n0,4);
163 n3= permute(n0,[1 2 4 3]);
164 n3=reshape(n3,[],8);
165 img=gc2dec(n3);
166 img=reshape(img,s1,s2,s4);
167 else
168 disp("ERROR! Unknown BitCode");
169 end
170
171image = exp(1i*img(:,:,1)/256*2*pi);
172
173setWS('Hologram','ga_convergence',konvergenz/Hologram.pixelX/Hologram.pixelY);
174
175if(Hologram.ga_plot)
176 %Ausgabe des Fehlers über die Iterationen
177 figure();
178 plot(konvergenz/Hologram.pixelX/Hologram.pixelY);
179end
180
181end
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...
Definition: Camera.m:5
Property pixelPitch
Pixelgröße in mm.
Definition: Camera.m:16
Hologramme werden als Objekte vom Typ Hologram dargestellt.
Definition: Hologram.m:11
Property ga_elite
in % Anteil der Bilder, die für den nächsten Iterationsschritt behalten wird
Definition: Hologram.m:188
Property ga_image
Dateipfad zu dem Bild, welches dargestellt werden soll.
Definition: Hologram.m:201
Property pixelPitch
Abstand der Pixel.
Definition: Hologram.m:34
Property ga_bitCode
'binary', 'gray' Binäre Codierung der Graustufen oder Nutzung des 'Greycode' (Binär ist deutlich schnelle...
Definition: Hologram.m:197
Property ga_population
Population = Anzahl der Bilder, die in jedem Schritt getestet werden.
Definition: Hologram.m:182
Property pixelX
Auflösung der Berechnung.
Definition: Hologram.m:29
Property ga_color
'grayValues' oder 'binary' Konvertierung des darzustelenden Bildes in Graustufen oder Schwarz-Weiß
Definition: Hologram.m:207
Property ga_invertColors
Invertierung der Farben.
Definition: Hologram.m:213
Property ga_resizeMode
'stretch', 'original', 'repeat' Anpassung des Bildes an die Hologrammauflösung
Definition: Hologram.m:204
Property ga_limitGrayLevel
Schwellwert für die Schwarz-Weiß-Konvertierung.
Definition: Hologram.m:210
Property pixelY
Definition: Hologram.m:31
Property ga_evaluation
'calculated' oder 'camera' Auswahl der Methode zur Evaluation der Bilder. Bei 'calculated' wird die I...
Definition: Hologram.m:216
Property ga_iteration
Anzahl der Iterationen.
Definition: Hologram.m:191
Definition: SLM.m:7
function gc2dec(in gra)
#define max(a, b)
Definition: nuts_bolts.h:56
function prepImage(in path, in x, in y, in resizeMode, in color, in limitGrayLevel, in invert)
function setWS(in field, in param, in value)