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

Podobne dokumenty