Politechnika Warszawska
Transkrypt
Politechnika Warszawska
Politechnika Warszaw ska Wydział Mechatroniki Instytut Mikromechaniki i Fotoniki Z a k ł a d Te c h n i k i O p t y c z n e j Agnieszka Zaraś Nr albumu: 199924 Maciej Wielgus Nr albumu: 199916 Generacja hologramu syntetycznego z hologramu cyfrowego Budowa oprogramowania (Matlab) do segmentacji rzeczywistego obrazu z rekonstrukcji hologramu cyfrowego Generation of synthetic hologram from digital hologram Matlab software for segmentation of the real image from digital hologram reconstruction Praca przejściowa Praca wykonana pod kierukiem dra inż. Tomasza Kozackiego Zakład Techniki Optycznej czerwiec 2009 Streszczenie W pracy przedstawiono oprogramowanie w środowisku Matlab umożliwiające generację hologramu syntetycznego z hologramu cyfrowego oraz wygodną modyfikację parametrów takich jak długość fali, odległość propagacji czy parametry algorytmu segmentacji poprzez graficzny interfejs użytkownika. Opracowano oparty na progowaniu wariancji algorytm segmentacji rzeczywistego obrazu z rekonstrukcji hologramu cyfrowego, generujący binarną maskę dla hologramu. Przedyskutowano implementację metody w środowisku Matlab oraz definiowane przez użytkownika parametry algorytmu. Abstract We present Matlab application which enables designing synthetic hologram from digital one. Via graphic user interface it allows to change parameters like laser wavelength, propagation distance and segmentation algorithm parameters easily. We provide variation-based method of segmentation the real image from digital hologram reconstruction, which involves creating binary mask for the hologram. We discuss the implementation in Matlab environment and user-defined parameters of algorithmes. 2 3 Spis treści 1. Wprowadzenie........................................................................................................5 1.1. Metoda tworzenia hologramu syntetycznego................................................................5 1.2. Usuwanie bliźniaczego obrazu .....................................................................................6 2. Algorytm segmentacji............................................................................................7 2.1. Dyskusja wyboru i opis metody....................................................................................7 2.2. Funkcja mask.m - opis i kod.........................................................................................7 2.3. Funkcja variance2.m - opis i kod..................................................................................8 2.4. Funkcja erozja.m - opis i kod......................................................................................10 2.5. Przykładowe wyniki działania algorytmu....................................................................11 3. Oprogramowanie do generacji hologramu syntetycznego...................................12 3.1. Opis kolejnych czynności............................................................................................12 3.2. Kod programu głównego.............................................................................................15 3.3. Dodatkowe wykorzystane funkcje...............................................................................24 4. Bibliografia...........................................................................................................26 4 1. Wprowadzenie 1.1. Metoda tworzenia hologramu syntetycznego Metoda składa się następujących etapów: • Rejestracji hologramu przy użyciu kamery CCD • Numerycznej rekonstrukcji hologramu • Usunięciu szumów pochodzących z obrazu sprzężonego • Zastosowanie iteracyjnego algorytmu Gerchberga-Saxona do uzyskania fazy Obraz holograficzny jest uzyskiwany z jednego obrazu interferencyjnego, od którego odjęta została jego uśredniona wartość intensywności. Otrzymana w ten sposób macierz jest poddawana przekształceniom w dalszej części programu. Do rekonstrukcji w płaszczyźnie usuwanego obrazu został zastosowany algorytm umożliwiający propagację obrazu na dowolną odległość. Istota algorytmu oparta jest na numerycznym obliczeniu dyfrakcyjnej całki fresnelowskiej, wyrażanej ułamkową transformatą Fouriera (FRT), przy pomocy FFT. Wykorzystana jest funkcja PSF (point spread function), która definiuje propagację promieniowania elektromagnetycznego z punktowego źródła. Następnie generowana jest maska dopasowana do danego obrazu. Przemnożenie maski przez macierz powoduje wyzerowanie wartości składających się na obraz niepożądany (dokładny opis tego etapu w paragrafie 1.2.). Tak zmodyfikowany front falowy jest poddawany operacji odwrotnej propagacji najpierw do płaszczyzny hologramu, a potem propagacji do płaszczyzny obrazu sprzężonego. W płaszczyźnie tej otrzymujemy odwrócony obraz hologramu, lecz już bez bliźniaczego szumu. Za powrotną propagację odpowiedzialna jest funkcja undo_farprop2.m, która jest odwrotnością funkcji farprop2.m. Ostatni etap poświęcony jest zaprojektowaniu fazy kinoformu, który da założony rozkład intensywności w płaszczyźnie rekonstrukcji. W tym przypadku dana jest wyjściowa intensywność, natomiast szukany jest taki rozkład fazy, dla którego otrzymany zostanie rozkład intensywności najbardziej zbliżony do rozkładu założonego. W tym celu zastosowany został iteracyjny algorytm Gerchberga-Saxona (GS), będący podstawowym algorytmem używanym do tego typu zastosowań. W szeregu iteracji otrzymywane są kolejno rozwiązania, których wynik jest coraz bardziej zbliżony do funkcji wyjściowej. Kolejne iteracje składają się z 6 kroków: 1. Wybór fazy wejściowej, stanowiącej pierwsze przybliżenie szukanej wartości fazy 2. Uzyskanie zespolonego pola optycznego dla rozpatrywanej fazy, wykorzystując funkcję przenoszenia wolnej przestrzeni 3. Zastąpienie otrzymanego rozkładu amplitudy oczekiwanym rozkładem wyjściowym 4. Propagacja w wolnej przestrzeni otrzymanego w poprzednim kroku rozkładu zespolonego na odległość –z do płaszczyzny wejściowej (w tym kroku w programie do wykonania operacji propagacji wykorzystana została funkcja PropagateFresnelC2D) 5. Zastąpienie otrzymanego rozkładu amplitudowego stałym rozkładem amplitudy hologramu 6. Powrót do kroku 1 - otrzymana faza jako faza wejściowa. Końcowym wynikiem algorytmu GS jest obraz otrzymany dla obliczonej fazy. 5 1.2. Usuwanie bliźniaczego obrazu Jak wiadomo, w wyniku odtworzenia zarejestrowanego hologramu otrzymuje się dwa symetryczne (bliźniacze) obrazy przedmiotu - rzeczywisty i urojony. Obecność elementu rzeczywistego manifestuje się rozproszonym szumem w płaszczyźnie ostrego odwzorowania elementu urojonego i na odwrót, rys.1: Istotnym problemem holografii jest usunięcie tego szumu, a tym samym poprawa jakości odwzorowania wybranego obrazu. Opracowano szereg różnych metod to umożliwiających. W niniejszej pracy efekt jest osiągnięty przez filtrację zespolonego czoła fali, polegającą na przestrzennej eliminacji niepożądanego obrazu w płaszczyźnie jego ostrej rekonstrukcji. Do zalet tego podejścia zaliczyć można fakt, iż wystarczy tu pojedyncza rejestracja hologramu (w przeciwieństwie np. do metody PSI - przesuniętej fazy), ponadto stosowne algorytmy mają względnie niewielką złożoność obliczeniową, efekty zaś są porównywalne do uzyskanych w inny sposób. Ściślej, metoda działa następująco: dla tablicy reprezentującej zespolony front falowy w płaszczyźnie ostrego obrazu usuwanego obliczana jest binarna maska, której przemnożenie przez tablicę powoduje wyzerowanie wartości reprezentujących zrekonstruowany obraz niepożądany, rys. 2: 6 2. Algorytm segmentacji 2.1. Dyskusja wyboru i opis metody Istnieją różne typy algorytmów segmentacji obrazu, a więc jego podziału na obszary reprezentujące różne elementy. Najprostsze dokonują progowania intensywności, dzieląc obraz na rozłączne części o różnych wartościach natężenia barw podstawowych. Dużą zaletą takiego podejścia jest niewielka złożoność obliczeniowa, jednak w wypadku obrazów otrzymanych przez numeryczną propagację hologramu stosowalność tych metod jest mocno ograniczona, ze względu na niejednorodność obrazu. Spośród bardziej zaawansowanych algorytmów publikacje ([2], [3], [4]) wymieniają metodę maksymalizacji wartości oczekiwanej (EM - expectation-maximization) i progowania wariancji (VT - variance tresholding) jako odpowiednie do rozważanego celu. Ostatecznie do implementacji wybrany został algorytm progowania wariancji, ze względu na jego mniejszy koszt obliczeniowy oraz częstsze występowanie w poświęconych tematyce publikacjach. Za metodą VT stoi prosta idea - gdy obraz obiektu jest ostry, duża jest dynamika zmian intensywności między sąsiadującymi pikselami (w przeciwieństwie do bardziej rozmytego i jednorodnego obrazu nieostrego). Dobrą miarą tej wielkości jest statystyczna wariancja intensywności obliczona w pewnym sąsiedztwie danego punktu. Zatem przy pomocy VT stwierdzić można, czy dany piksel reprezentuje element ostro odwzorowanego obiektu (duża wariancja) w szczególności na podstawie tej informacji można dokonać segmentacji obrazu rzeczywistego w płaszczyźnie jego powstawania. Oczywiście trójwymiarowy przedmiot nie posiada jednej płaszczyzny ostrego odwzorowania sugeruje to podejście polegające na tworzeniu wielu map wariancji odpowiadających różnym odległościom propagacji i rozpatrywanie wartości maksymalnej dla każdego piksela (podejście z [4] ). Ma to jednak negatywny wpływ na czas obliczeń i z tego względu zdecydowano się na generację maski na podstawie pojedynczej mapy wariancji dla pewnej wybranej płaszczyzny (analogicznie jak w [3]). 2.2. Funkcja mask.m Funkcja mask(in,n,tau) wykonuje pełny algorytm segmentacji, zwracajac binarną macierz wygenerowanej na podstawie tablicy in maski. Parametr n oznacza rozmiar sąsiedztwa każdego piksela, w którym obliczana jest wariancja. W [2] przeprowadzono dyskusję optymalnego wymiaru n, z której wynika, że przy najlepszym doborze progu, dokładniejszą selekcję zapewnia większa wartość n - nawet do 150 (co oczywiście nie pozostaje bez wpływu na szybkość działania algorytmu). Parametr tau jest współczynnikiem progowania - funkcja mask przyjmuje za próg iloczyn parametru tau i pewnej obliczonej wielkości zależnej od średniej wartości tablicy wariancji. Do pewnego stopnia umożliwia to automatyzację doboru progu - optymalna postać maski spodziewana jest dla tau bliskiego jedności. Warto zwócić uwagę, że w poświęconych tematowi publikacjach nie zaproponowano efektywnego i uniwersalnego sposobu doboru wartości progowej, zaś dla konketnych obrazów wartość różni się nawet o dwa rzędy wielkości ([4]). Zwiększenie tau oznacza zwiększnie poziomu progowego, a zatem zmniejszenie zerowego obszaru binarnej maski. Funkcja mask umożliwia ponadto dokonanie wstępnej filtracji obrazu (hom = 1, domyślnie zablokowane) i wyłączenie algorytmu erozji (er = 0, domyślnie erozja wykonywana). 7 Kod 1: function m=mask(in,n,tau,er,hom) if nargin<4 er = 1; hom = 0; end; if nargin<2 n = 51; tau=0.7; er = 1; hom = 0; end; tic if (rem(n,2) == 0) n = n+1; end [M,N]=size(in); temp = in; if (hom ==1) temp = homogenizator(in); end %optional filter var = variance2(temp,n); t = sum(sum(var))/(M*N); temp2 = var; temp2 = min(t, temp2); t = sum(sum(temp2))/(M*N); t = t*tau; m = (temp2 < t); if (er ~= 0) m = erozja(m, (n+1)/2,1); end toc 2.3. Funkcja variance2.m Funkcja variance2(in,n) zwraca mapę wariancji tablicy modułów in każdego piksela (n nieparzyste), zgodnie z wz.1: gdzie, wz.2: 8 za otoczenia wymiaru n Implementacja jest tak dobrana, aby przy liczeniu wariancji w kolejnym punkcie maksymalnie wykorzystać wartości obliczone w punkcie poprzednim i tym samym przyspieszyć działanie programu. Zasadnicze znaczenie ma też znany wzór z rachunku prawdopodobieństwa, wz.3: Dzięki niemu mapę wariancji można obliczyć przy pojedynczym przejściu pętli przez wszystkie piksele obrazu. Czas obliczania mapy wariancji stanowi większą część czasu projektowania maski, tym bardziej na uwagę zasługują opisane w [3] wyniki implementacji algorytmu mapowania wariancji na procesorze graficznym - uzyskano niemal tysiąckrotne przyspieszenie. Kod 2: function var=variance2(in,n) %returnes statistical variation for pixel's n-neigbourhood if nargin<2 n = 101; end; [M,N]=size(in); temp = abs(in).*abs(in); sq_temp = temp.^2; temp3 = sum(temp( 1:n, 1:N )); %average temp2 = sum(sq_temp(1:n, 1:N )); for i = 1:(M - n) temp2 = temp2 + sq_temp(n+i,1:N) - sq_temp(i,1:N) ; temp3 = temp3 + temp(n+i,1:N) - temp(i,1:N); m(i,1)= sum(temp3(1:n)); var(i,1) = sum(temp2(i:n)); for j = 1:(N-n) m(i,j+1) = m(i,j) + temp3(n+j) - temp3(j); var(i,j+1) = var(i,j) + temp2(n+j) - temp2(j); end end m = m/n^2 ; temp = zeros(M,N); temp((n+3)/2:M-(n-1)/2,(n+1)/2:N-(n-1)/2) = var/n^2 - m.^2; var = temp; 9 2.4. Funkcja erozja.m Rolą algorytmu erozja(in,n,level) jest w tym zastosowaniu zmniejszenie obszaru zerowego maski binarnej otrzymanej z progowania wariancji - jest on (przy właściwym wyborze współczynnika progu tau) większy od samego obrazu, co jest wynikiem obliczania wariancji w dużych blokach sąsiedztwa punktu. Jest to dość standardowy algorytm morfologicznej operacji erozji obrazu binarnego ([7], [8]) z tablicą kwadratową wymiaru n (domyślnie połowa wymiaru tablic użytych do liczenia wariancji). Parametr level oznacza „czułość” erozji (ilość pikseli wartości jeden w sąsiedztwie potrzebnych, by piksel wartości zero zamienić na jedynkowy - „zerodować”) i jest domyślnie jedynką. Modyfikacja parametrów algorytmu erozji daje dodatkową możliwość zwiększenia jakości maski w konkretnym zastosowaniu. Kod 3: function e=erozja(in,n,level) %morphology erosion of binary picture if nargin<2 n = 50; level =1; end; if (rem(n,2) == 0) n = n+1; end [M,N]=size(in); m = ones(M,N); for i = 1:M temp2 = sum(in( max(i - ((n-1)/2),1):min(i+(n-1)/2, M), 1:N )); for j = 1:N if(in(i,j) == 0) m(i,j) = sum( temp2(max( j - ((n-1)/2),1):min(j+(n-1)/2, N)) ); end end end e = min(level, m); e = (e == level); 10 2.5. Przykładowe wyniki działania algorytmu Zawarte w poniższej tabeli wyniki ilustrują jakościowo wpływ parametrów algorytmu maski na otrzymany rezultat: n \ tau 0.3 1.0 21 81 151 11 3 3. Oprogramowanie do generacji hologramu syntetycznego 3.1. Opis kolejnych czynności W tym paragrafie przedstawiony jest zaprojektowany w środowisku Matlab program do generacji hologramu syntetycznego. Rys. 1 przedstawia ogólny widok aplikacji: Rys.1. Graficzny interfejs użytkownika W graficznym interfejsie użytkownika, użytkownik po wczytaniu obrazu wprowadza odległość propagacji oraz długość fali świetlnej, jaka ma być wykorzystana do rekonstrukcji. Uzyskana zostaje rekonstrukcja, rys. 2: Rys.2. Obraz otrzymany po rekonstrukcji hologramu 12 Użytkownik może zmieniać intensywność z wyświetlanego obrazu hologramu. Dla wybranej przez użytkownika wartości progowej pr wszystkie wartości macierzy D są przekształcane funkcją: gdzie D’ jest macierzą o wartościach równych modułom obrabianej macierzy, natomiast DD, jest wyświetlaną macierzą. Dzięki tej operacji wyświetlany obraz jest jaśniejszy i bardziej widoczny. Operacja ta jest wykonywana wielokrotnie w różnych częściach programu i jest wykorzystywana wyłącznie do wyświetlania obrazu w odpowiedniej intensywności. Nie wpływa ona na wartości przekształcanej macierzy, rys. 3: Rys.3. Rozjaśniony obraz W interfejsie użytkownika jest możliwość wyświetlenia i zmiany parametrów maski, tj. wielkości sąsiedztwa oraz współczynnika progowania. Służy to lepszemu dopasowaniu maski do konkretnego obrazu, rys. 4: Rys.4. Wyświetlenie nałożonej maski 13 Po zaakceptowaniu maski otrzymujemy poprawioną rekonstrukcję, rys. 5: Rys.5. Wynik usunięcia bliźniaczych szumów Ostatnią operacją jest zastosowanie algorytmu G-S, rys. 6: Rys.6. Końcowy obraz Spłaszczenie obrazu jest wynikiem zamiany prostokątnej macierzy na macierz kwadratową. Operacja ta była potrzebna do prawidłowego zadziałania algorytmu. 14 3.2. Kod programu głównego function varargout = holo1(varargin) % HOLO1 M-file for holo1.fig % HOLO1, by itself, creates a new HOLO1 or raises the existing % singleton*. % % H = HOLO1 returns the handle to a new HOLO1 or the handle to % the existing singleton*. % % HOLO1('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in HOLO1.M with the given input arguments. % % HOLO1('Property','Value',...) creates a new HOLO1 or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before holo1_OpeningFunction gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to holo1_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Copyright 2002-2003 The MathWorks, Inc. % Edit the above text to modify the response to help holo1 % Last Modified by GUIDE v2.5 25-Jun-2009 13:48:00 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @holo1_OpeningFcn, ... 'gui_OutputFcn', @holo1_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT 15 % --- Executes just before holo1 is made visible. function holo1_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to holo1 (see VARARGIN) % Choose default command line output for holo1 handles.output = hObject; % Update handles structure guidata(hObject, handles); % UIWAIT makes holo1 wait for user response (see UIRESUME) % uiwait(handles.figure1); % --- Outputs from this function are returned to the command line. function varargout = holo1_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; % --- Executes on button press in openplik. function openplik_Callback(hObject, eventdata, handles) % hObject handle to openplik (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global B; global D; plik=uigetfile; %funkcja wyboru pliku L=load (plik); %zaladowanie pliku global Ldata; %-------------------------------------------------------------------------Ldata=L; d=str2num(get(handles.edit1,'string'));%odleglosc propagacji przypisywana z okna edit1 lambda=str2num(get(handles.edit2,'string'));%dlugosc fali przypisywana z okna edit2 lambda=lambda*10^(-6)%zamiana nanometrów na milimetry hol=double(L.I1); B=hol-mean(mean(hol));%odjęcie od hologramu jego uśrednionej wartości handles.axes1; %odwolanie sie do axes1 hp1=imagesc(B); D=farprop2(d,B,lambda);%rekonstrukcja hoogramu %-----------------------------------------------------------hp2=imagesc(abs(D)); %wyswietlenie obrazu colormap gray; axis off; picture=imagesc(abs(D)); 16 set(handles.radiobutton1,'Value',get(handles.radiobutton1,'min')) function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit1 as text % str2double(get(hObject,'String')) returns contents of edit1 as a double % --- Executes during object creation, after setting all properties. function edit1_CreateFcn(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes on button press in odpal. function odpal_Callback(hObject, eventdata, handles) % hObject handle to odpal (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global B; global D; global d; d=str2num(get(handles.edit1,'string'));%odleglosc propagacji przypisywana z okna edit lambda=str2num(get(handles.edit2,'string'));%dlugosc fali przypisywana z okna edit2 handles.axes1; %odwolanie sie do axes1 lambda=lambda*10^(-6)%zamiana nanomertow na milimetry D=farprop2(d,B,lambda);%rekonstrukcja hoogramu colormap gray; %------ZMIANA INTENSYWNOSCI DD=abs(D); %utworzenie macierzy DD o wartosciach będących modulami wartosci macierzy D save D; pr=get(handles.slider1,'Value');%wartosc pr pobierana z suwaka if pr==0; pr=0.1; end; %gdy suwak jest ustawiony na wartość zerową, to przyjmujemy pr=0.1 maxin=max(max(DD));% szukanie wartości maksymalnej DD=DD/maxin; % znormalizowanie DD=1-exp(-10*pr*DD);%przeksztalcenie wartosci macierzy DD=DD*maxin;%skalowanie do wejsciowego przedziału 17 handles.axes1; %odwolanie sie do axes1 picture=imagesc((DD));%wyswietlenie obrazu colormap gray; axis off; % --- Executes on button press in radiobutton1. function radiobutton1_Callback(hObject, eventdata, handles) % hObject handle to radiobutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hint: get(hObject,'Value') returns toggle state of radiobutton1 global D; global Dmask Dtemp=D; %przepisanie macierzy D do tymczasowej macierzy if (get(hObject,'Value') == get(hObject,'Max'))%jesli radiobutton jest zaznaczony disp('Computing image masc . Please WAIT....');%wyswietlenie komunikatu n=str2num(get(handles.edit3,'string'));%wielkosc sasiedztwa przypisana z okna edit3 tau=str2num(get(handles.edit4,'string'));%wartosc progowania przypisana z okna edit4 Dmask=mask(D,n,tau);%funkcja tworzenia maski disp('Computing image masc done');%wyswietlenie komunikatu else Dmask=ones(size(D));%robi czysta maske Dmask(:,:)=true; end; % --- Executes on button press in pushbutton5. function pushbutton5_Callback(hObject, eventdata, handles) % hObject handle to pushbutton5 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global D; global H; global G; global picture; global Dmask d=str2num(get(handles.edit1,'string')); lambda=str2num(get(handles.edit2,'string'));%d_ugo__ fali przypisywana z okna edit2 lambda=lambda*10^(-6)%zamiana nanometrów na milimetry if (get(handles.radiobutton1,'Value') == get(handles.radiobutton1,'Max')) D(Dmask==0)=0;%nakladanie maski na D jesli radiobutton jest zaznaczony F=undo_farprop2(d,D,lambda); %operacja odwrotnej propagacji FFT = fftshift(fft2(fftshift(F))); G = farprop2(-d,F,lambda);%propagacja do obrazu sprzezonego 18 %------ZMIANA INTENSYWNOSCI DD=abs(G); maxin=max(max(DD)); DD=DD/maxin; % znormalizowanie pr=get(handles.slider1,'Value'); DD=1-exp(-10*pr*DD); DD=DD*maxin; handles.axes1; %odwolanie sie do axes1 DD=fliplr(flipud(DD));%odwrócenie macierzy H=imagesc(DD); picture=farprop2(-d,F,lambda);%zapamietanie macierzy G colormap(gray); axis off; set(handles.radiobutton1,'Value',0) end; % --- Executes on button press in pushbutton6. function pushbutton6_Callback(hObject, eventdata, handles) % hObject handle to pushbutton6 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) global D; global Dmask Dtemp=D; if (get(handles.radiobutton1,'Value') == get(handles.radiobutton1,'Max'))%jesli radoibutton jest nacisniety %-----------pokazanie maski---------obliczenia z maska po nacisnieciu przycisku Dtemp(Dmask==0)=0; %nalozenie maski %------ZMIANA INTENSYWNOSCI DD=abs(Dtemp); maxin=max(max(DD)); DD=DD/maxin; % znormalizowanie pr=get(handles.slider1,'Value'); DD=1-exp(-10*pr*DD); DD=DD*maxin; handles.axes1; imagesc(abs(Dtemp)); else %jesli nie - nalozenie pustej maski Dtemp(Dmask==0)=0; %------ZMIANA INTENSYWNOSCI DD=abs(Dtemp); maxin=max(max(DD)); DD=DD/maxin; % znormalizowanie pr=get(handles.slider1,'Value'); DD=1-exp(-10*pr*DD); DD=DD*maxin; handles.axes1; imagesc(abs(Dtemp)); 19 handles.axes1; imagesc(abs(Dtemp)); end function edit2_Callback(hObject, eventdata, handles) % hObject handle to edit2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit2 as text % str2double(get(hObject,'String')) returns contents of edit2 as a double % --- Executes during object creation, after setting all properties. function edit2_CreateFcn(hObject, eventdata, handles) % hObject handle to edit2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes on slider movement. function slider1_Callback(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'Value') returns position of slider % get(hObject,'Min') and get(hObject,'Max') to determine range of slider global B; global D; global d; global obraz; global Ldata; pr=get(hObject,'Value'); set(handles.text4,'String',num2str((pr)));%wyswietlanie wartosci suwaka %----------------------------------------------------------lambda=str2num(get(handles.edit2,'string'));%dlugosc fali przypisywana z okna edit2 lambda=lambda*10^(-6); d=str2num(get(handles.edit1,'string'));%odleglosc propagacji przypisywana z okna edit1 %----------------------------------------------------------hol=double(Ldata.I1); B=hol-mean(mean(hol)); 20 disp('Computing image WAIT....'); D=farprop2(d,B,lambda);%rekonstrukcja hoogramu disp('Computing done'); %------ZMIANA INTENSYWNOSCI DD=abs(D); maxin=max(max(DD)); DD=DD/maxin; % znormalizowanie DD=1-exp(-10*pr*DD); DD=DD*maxin; handles.axes1; %odwolanie sie do axes1 imagesc((DD)); %wyswietlenie obrazu colormap gray; axis off; % --- Executes during object creation, after setting all properties. function slider1_CreateFcn(hObject, eventdata, handles) % hObject handle to slider1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: slider controls usually have a light gray background, change % 'usewhitebg' to 0 to use default. See ISPC and COMPUTER. usewhitebg = 1; if usewhitebg set(hObject,'BackgroundColor',[.9 .9 .9]); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes on button press in pushbutton8. function pushbutton8_Callback(hObject, eventdata, handles) % hObject handle to pushbutton8 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) %--------ALGORYTM GS global lambda fx dfx mone Nx global G; global picture %---zamiana macierzy prostokatnej na kwadratowa [r,c]=size(picture); maxsize=max([r,c]); B0_temp=zeros(maxsize,maxsize); B0_temp(1:r,1:c)=picture; B0=B0_temp; [Nx,Ny]=size(B0); lambda=str2num(get(handles.edit2,'string'));%dlugosc fali przypisywana z okna edit2 lambda=lambda*10^(-3);%zamiana nanometrów na mikrometry 21 dx = 10; x = -Nx/2*dx : dx : dx*(Nx/2-1); dfx = 1/Nx/dx; fx = -Nx/2*dfx : dfx : dfx*(Nx/2-1); mone = ones(1,Nx); % odleglosc pomiedzy plaszczyzna wejsciowa i wyjsciowa z = Nx*dx^2/lambda; % a0 - amplituda sygnalu wejsciowego (kinoformu): const. a0 =ones(Nx,Nx); % fi0 - faza na wyjsciu kinoformu fi0 = 2*pi*rand(Nx,Nx); % B0 - pozadany obraz rozkladu amplitudy % poprawkowy parametr energetyczny energy_coef = sum(sum(abs(B0).^2)) ./ sum(sum(abs(a0).^2)); a0 = a0*sqrt(energy_coef); % w - zespolone pole na wyjsciu w = a0 .* exp(i*fi0 ); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %parametr do trzeciego kroku algorytmu alglambda = 1; %%%%%%%%%%%%%%%%%%%%%%%%% hbar = waitbar(0,'Please wait...'); for foo = 1:10 waitbar(foo/10) % 1-5 krokow iteracyjnych - GS if foo == 5 alglambda = 2; end % krok 2: propagacja w wolnej przestrzeni z wej. do wyj. f = PropagateFresnelC2D(w,z); % krok 3: zastapienie amplitudy absf_ = abs(alglambda*B0 + (1-alglambda)*abs(f)); f_ = absf_ .* f ./ abs(f); % krok 4: propagacja z wyj. do wej. w = PropagateFresnelC2D(f_,-z); %krok 5: zastapienie amplitudy w_ = a0.*w./abs(w); %krok 6: powrot do kroku 2 w=w_; 22 end close(hbar) %------ZMIANA INTENSYWNOSCI DD=abs(f); pr=get(handles.slider1,'Value'); if pr==0; pr=0.1; end; maxin=max(max(DD)); DD=DD/maxin; % znormalizowanie DD=1-exp(-10*pr*DD); DD=DD*maxin; handles.axes1; %odwolanie sie do axes1 imagesc(fliplr(flipud(abs(DD).*abs(DD))));%odwrocenie i wyswietlenie obrazu colormap gray; axis off; % --- Executes during object creation, after setting all properties. function axes1_CreateFcn(hObject, eventdata, handles) % hObject handle to axes1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: place code in OpeningFcn to populate axes1 function edit3_Callback(hObject, eventdata, handles) % hObject handle to edit3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % Hints: get(hObject,'String') returns contents of edit3 as text % str2double(get(hObject,'String')) returns contents of edit3 as a double % --- Executes during object creation, after setting all properties. function edit3_CreateFcn(hObject, eventdata, handles) % hObject handle to edit3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end function edit4_Callback(hObject, eventdata, handles) % hObject handle to edit4 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) 23 % Hints: get(hObject,'String') returns contents of edit4 as text % str2double(get(hObject,'String')) returns contents of edit4 as a double % --- Executes during object creation, after setting all properties. function edit4_CreateFcn(hObject, eventdata, handles) % hObject handle to edit4 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end 3.3. Dodatkowe wykorzystane funkcje Funkcja farprop.m %funkcja propagacji % ud: czolo fali po propagacji % d: odleglosc propagacji % ui: czolo fali przed propagacja % dx,dy: CCD rozmiar pikseli % lambda dlugosc fali % wszystkie wielkosci sa w mm function ud=farprop2(d,ui,lambda,dy,dx) if nargin<4 dx = 0.00645; dy = 0.00645; end; tic [M,N]=size(ui); uo=ui; [m,n]=meshgrid(-N/2:N/2-1,-M/2:M/2-1); g=exp(i*pi/lambda/d*((m*dx).^2+(n*dy).^2)); ud=fftshift(ifft2(fftshift(uo.*g))); clear uo g; ud=ud*exp(i*2*pi/lambda*d).*exp(i*pi*lambda*d*((m/M/dx).^2+(n/N/dy).^2)); clear m; clear n; toc 24 Funkcja undo_farprop.m %funkcja propagacji odwrotnej function ud=undo_farprop2(d,ui,lambda,dy,dx) if nargin<4 dx = 0.00645; dy = 0.00645; end; tic %włączenie zegara [M,N]=size(ui); %rozmiar talbicy uo=ui; [m,n]=meshgrid(-N/2:N/2-1,-M/2:M/2-1);%utworzenie siatki g=exp(-i*2*pi/lambda*d).*exp(-i*pi*lambda*d*((m/M/dx).^2+(n/N/dy).^2)); ud=fftshift(fft2(fftshift(uo.*g))); % fft2 gives a mirrored image ud=ud.*exp(-i*pi/lambda/d*((m*dx).^2+(n*dy).^2));clear uo g clear m; clear n; toc %wyłączenie zegara Funkcja PropagateFresnelC2D.m % to propagate create global matricses: lambda f df mxone myone function [Uout] = PropagateFresnelC2D(Uin,z,Kernel) global lambda fx dfx mone if (nargin < 3) Kernel = exp(j*2*pi/lambda*z)*exp(-j*pi*lambda*z*(mone'*(fx.^2)+(fx'.^2)*mone)); end % kernel violation fq fv = 1/(2*dfx*lambda*z); SigmaGA = fv/1.177; % propagation widmo = Kernel.*fftshift(fft2(Uin)); Uout = (ifft2(ifftshift(widmo))); Ponadto wykorzystane zostały funkcje algorytmu segmentacji: erozja, variance2, mask, opisane dokładnie w paragrafie 2. 25 4. Bibliografia [1] T. Kreis, Handbook of Holographic Interferometry, Wiley-Vch, New York, 2005. [2] C. McElhinney, J. McDonald, A. Castro, Y. Frauel, B. Javidi, T. Naughton, Depth independent segmentation of three-dimensional objects encoded in single perspectives of digital holograms, Opt. Lett. 32, pp. 1129-1231, 2007. [3] C. McElhinney, B. M. Hennelly, L. Ahrenberg, T. J. Naughton, Removing the Twin Image in Digital Holography by Segmented Filtering of In-focus Twin Image [4] C. P. McElhinney, J. B. McDonald, Albertina Castro, Yann Frauel, Bahram Javidi, T. J. Naughton, Segmentation of three-dimensional objects from background in digital holograms. [5] J. Goodman, Introduction to Fourier Optics, 2nd ed., McGraw-Hill, New York, 1966. [6] B. Mrozek, Z. Mrozek, Matlab i Simulink: Poradnik użytkownika, Helion, Gliwice, 2004. [7] J. C. Russ, The image processing handbook, CRC Press, London, 2007. [8] Quantitative Imaging Group of Delft University of Technology, An interactive image processing course, http://www.ph.tn.tudelft.nl/Courses/FIP/ 26