LAT Hologramm-Software 2.0
Loading...
Searching...
No Matches
Genetic_Algorithm_Zernike.m
Go to the documentation of this file.
1%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2% Funktion
3%
4% Berechnet Hologramm für die Zernikekorrektur
5% Angabe der Gewichtungsfakroten der ersten 13 Zernikepolynome als
6% Inputparameter
7
8% Noch nicht fertig implementiert
9
10%
11%Autor: Jan Marx
12%Letzte Änderung: 30.11.2022
13%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14
15%Zernikekorrektur.
16function [image] = Genetic_Algorithm_Zernike()
17%Paremeter#######################
18zernike = 13;
19n_fraction = 15;
20n_exponent = 2;
21bias = (2^(n_exponent-1)-1);
22depth = 1+n_fraction+n_exponent;
23%################################
24
25Hologram = evalin('base', 'Hologram');%#Hochgradig ineffiziente Lösung!!!
26SLM = evalin('base', 'SLM');%#Hochgradig ineffiziente Lösung!!!
27Camera = evalin('base', 'Camera');%#Hochgradig ineffiziente Lösung!!!
28
29inputBeam = Hologram.beamImage(Hologram.inputBeam_source, "gauss");%##gauss ggf. später noch ändern
30
31if(Hologram.ga_evaluation == "calculated")
33elseif(Hologram.ga_evaluation == "camera")
34 target = single(prepImage(Hologram.ga_image,Camera.pixelX,Camera.pixelY, Hologram.ga_resizeMode, Hologram.ga_color, Hologram.ga_limitGrayLevel, Hologram.ga_invertColors));
35else
36 disp("ERROR - UNKNOWN EVALUATION MODE FOR GENETIC ALGORITHM");
37end
38
39
40%Parameterkontrolle
41%if((mod(Hologram.ga_population*(Hologram.ga_elite/100),2) ~=0) || (mod(1/(Hologram.ga_elite/100),1)~=0))
42% disp('Abbruch! \n Population * Elite muss durch 2 teilbar sein! \n 1:population*elite muss ganze Zahl sein');
43% return
44% %#Später abändern, dass das kein Problem mehr ist
45%end
46
47%#Auswahl Kamera oder Calculated
48
49
50
51%Start, Startpopulation
52
53n0 = false(zernike,depth,Hologram.ga_population);
54for n=1:size(n0,1)
55 for o=1:size(n0,2)
56 for p=1:size(n0,3)
57 if(rand()<0.5)
58 n0(n,o,p) = true;
59 end
60 end
61 end
62end
63
64%Iteration
65
66konvergenz = single(zeros(Hologram.ga_iteration,1));
67tic
68for i=1:1:Hologram.ga_iteration
69 %Mutation
70 for n=1:size(n0,1)
71 for o=1:size(n0,2)
72 for p=1:size(n0,3)
73 if(rand()<Hologram.ga_mutationProb/100)
74 n0(n,o,p) = ~n0(n,o,p);
75 end
76 end
77 end
78 end
79
80 %toc
81 while(size(n0,3)<=Hologram.ga_population)
82 %Zufällig sortieren
83 randVector = int16(randperm(size(n0,3)));
84 n1 = false(zernike,depth,size(n0,3));
85 for individuum = 1:size(n0,3)
86 n1(:,:,individuum)= n0(:,:,randVector(individuum));
87 end
88
89 %Crossover --> 1,5p
90 n0 =false(size(n1,1),size(n1,2),floor(size(n1,3)/2));
91
92 for p = 2:2:size(n1,3)
93 child(:,:) = int8(n1(:,:,p)+n1(:,:,p-1));
94 for m=1:size(n0,1)
95 for n=1:size(n0,2)
96 %Zufällige Gen-Weitergabe
97 if(child(m,n)==1)
98 n0(m,n,p/2)=round(rand());
99 end
100 if(child(m,n)==2)
101 n0(m,n,p/2)=1;
102 end
103
104 end
105 end
106 end
107 n0= logical(cat(3, n1,n0));
108 end
109 %toc
110 %Bewertung
111 evaluation = zeros(size(n0,3),1);
112 %Binärcode in Bild umwandeln
113 w = zeros(size(n0,1),size(n0,3));
114
115 %Hier Auswahl Binärecode / Graycode
116 if(Hologram.ga_bitCode == "binary")
117
118 s = zeros(size(n0,1),size(n0,3));
119 exponent = zeros(size(n0,1),size(n0,3));
120 fraction = zeros(size(n0,1),size(n0,3));
121
122 s(:,:) = (-1.*ones(size(n0,1),size(n0,3))).^reshape(n0(:,1,:),[size(n0,1),size(n0,3)]);
123 for n=2:1+n_exponent
124 exponent(:,:) = double(exponent(:,:) + 2^(n-2)*reshape(n0(:,n,:),[size(n0,1),size(n0,3)]));
125 end
126 for n=2+n_exponent:depth
127 fraction(:,:) = double(fraction(:,:) + 2^-(n-10)*reshape(n0(:,n,:),[size(n0,1),size(n0,3)]));
128 end
129
130 w=s.*(1+fraction).*2.^(exponent-bias);
131
132
133 elseif (Hologram.ga_bitCode == "gray")
134 disp("ERROR! GrayCode not implemented");
135 else
136 disp("ERROR! Unknown BitCode");
137 end
138
139 %Fehler berechnen
140 for q=1:size(n0,3)
141 if(Hologram.ga_evaluation == "calculated")
142
143 %Berechnetes Bild zur Evaluation
144 result = abs(fftshift(fft2(fftshift(abs(inputBeam).*Zernike(w(:,q))))));
145 result = result/max(max(result));
146 evaluation(q)=single(sum(sum(abs((result(:,:)-target(:,:)).^2))));
147
148 %#Hier beachten, dass Pixel unterschiedlich groß sind!
149 elseif(Hologram.ga_evaluation == "camera")
150 SLM.sendImage(Phase_Image(Zernike(w(:,q))));
151 %Gemessenes Bild zur Evaluation
152 beamProfile=Camera.getImage();
153 %#Hier Bildgröße anpassen
154 result = Scale_and_ResizeImage(single(beamProfile), Hologram.pixelX,Hologram.pixelY,'original', Camera.pixelPitch, Hologram.pixelPitch);
155 result = result/max(max(result));
156 evaluation(q)=single(sum(sum(abs((result(:,:)-target(:,:)).^2))));
157 else
158 disp("ERROR - UNKNOWN EVALUATION MODE FOR GENETIC ALGORITHM");
159 end
160 end
161 evaluation=single(evaluation(:,1));
162 %toc
163
164 %Sortieren
165 [error,ind]=sort(evaluation);
166 n1=n0;
167 for k=1:1:size(n0,3)
168 n1(:,:,k) = n0(:,:,ind(k));
169 end
170
171 %Selektion --> 1p
172 n0 = n1(:,:,1:round(Hologram.ga_population*(Hologram.ga_elite/100)));
173
174 %Zwischenausgabe
175 if(evalin('base','Hologram.displayProgress'))
176 if(mod(i/Hologram.ga_iteration*100,10)==0)
177 disp(strcat(string(i/Hologram.ga_iteration*100),"%"));
178 end
179 end
180 konvergenz(i)=single(error(1));
181end
182
183
184%Ergebnis
185w = zeros(size(n0,1),size(n0,3));
186
187s = zeros(size(n0,1),size(n0,3));
188 exponent = zeros(size(n0,1),size(n0,3));
189 fraction = zeros(size(n0,1),size(n0,3));
190
191 s(:,:) = (-1.*ones(size(n0,1),size(n0,3))).^reshape(n0(:,1,:),[size(n0,1),size(n0,3)]);
192 for n=2:1+n_exponent
193 exponent(:,:) = double(exponent(:,:) + 2^(n-2)*reshape(n0(:,n,:),[size(n0,1),size(n0,3)]));
194 end
195 for n=2+n_exponent:depth
196 fraction(:,:) = double(fraction(:,:) + 2^-(n-10)*reshape(n0(:,n,:),[size(n0,1),size(n0,3)]));
197 end
198
199 w=s.*(1+fraction).*2.^(exponent-bias);
200
201image = Zernike(w(:,1));
202disp(w(:,1))
203
204setWS('Hologram','ga_convergence',konvergenz/Hologram.pixelX/Hologram.pixelY);
205%bei Bedarf auskommentieren
206figure();
207plot(konvergenz/Hologram.pixelX/Hologram.pixelY);
208end
209
210
211
function Genetic_Algorithm_Zernike()
Genetischer Algorithmus berechnet Hologramm für die.
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...
function Zernike(in weighting)
Ermöglicht die Wellenfrontkorrektur für ein SLM-Bild durch Angabe der Gewichtungsfaktoren der einzelnen Zerni...
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_image
Dateipfad zu dem Bild, welches dargestellt werden soll.
Definition: Hologram.m:201
Property inputBeam_source
Definition: Hologram.m:81
Property pixelPitch
Abstand der Pixel.
Definition: Hologram.m:34
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
function beamImage(in obj, in source, in name)
Gibt Bild des Eingangsstrahls aus.
Property ga_evaluation
'calculated' oder 'camera' Auswahl der Methode zur Evaluation der Bilder. Bei 'calculated' wird die I...
Definition: Hologram.m:216
Definition: SLM.m:7
#define true
Definition: nuts_bolts.h:26
#define false
Definition: nuts_bolts.h:25
#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)