ALGORITHMS FOR THE REMOVAL OF HEAT

Transcription

ALGORITHMS FOR THE REMOVAL OF HEAT
ALGORITHMS FOR THE REMOVAL OF
HEAT SCINTILLATION IN IMAGES
by
Rishaad Abdoola
Submitted in fulfilment of the requirements for the degree
MAGISTER TECHNOLOGIAE: ENGINEERING: ELECTRICAL
in the
Department of Electrical Engineering
FACULTY OF ENGINEERING AND THE BUILT ENVIRONMENT
TSHWANE UNIVERSITY OF TECHNOLOGY
Supervisor: Prof B van Wyk
Co-Supervisor: Prof A van Wyk
May 2008
ii
DECLARATION BY CANDIDATE
“I hereby declare that the dissertation submitted for the degree M Tech: Engineering:
Electrical, at Tshwane University of Technology, is my own original work and has
not previously been submitted to any other institution of higher education. I further
declare that all sources cited or quoted are indicated and acknowledged by means of a
comprehensive list of references”.
…………………
Rishaad Abdoola
Copyright© Tshwane University of Technology
iii
To my parents, my brother and my sister
for all your support and patience. Thank you.
iv
ACKNOWLEDGEMENTS
I would like to express my sincere gratitude and appreciation to my supervisors: Prof.
Ben van Wyk and Prof. Anton van Wyk for their guidance, support and advice during
the completion of this project. Thank you for always having time and patience and for
all the effort given in completing this project.
I would also like to thank F’SATIE (French South African Technical Institute in
Electronics) for all the opportunities and facilities provided in completing this project.
I thank all the lecturers and students at F’SATIE and TUT (Tshwane University of
Technology) for all their assistance.
I would like to thank Dr. Dirk Bezuidenhout and Mark Holloway from the CSIR
(Council for Scientific and Industrial Research) for their significant help in providing
me with the turbulence sequences.
Special thanks go to Tshwane University of Technology, F’SATIE and the CSIR for
their financial support. The financial assistance of the DPSS (Defence, Peace, Safety
and Security) towards this research is hereby acknowledged. Opinions expressed and
conclusions arrived at, are those of the author and are not necessarily to be attributed
to the DPSS, TUT or CSIR.
v
ABSTRACT
Heat scintillation occurs due to the index of refraction of air decreasing with an
increase in air temperature, causing objects to appear blurred and waver slowly in a
quasi-periodic fashion. This imposes limitations on sensors used to record images
over long distances resulting in a loss of detail in the video sequences. Algorithms and
techniques for the restoration of image sequences degraded by atmospheric turbulence
are investigated. A comparative analysis of these algorithms is performed. An
algorithm, developed to simulate the effects of atmospheric turbulence, is presented
and a GUI (Graphical User Interface) is developed. Focus is placed on the removal of
heat scintillation, a special case of atmospheric turbulence, from video sequences.
vi
GLOSSARY
AOI: Adaptive Optics Imaging.
CGI: Control Grid Interpolation.
CSIR: Council for Scientific and Industrial Research.
DWFS: Deconvolution from Wave-Front Sensors.
FATR: First Average Then Register.
FRTAAS: First Register Then Average And Subtract.
FSATIE: French South African Technical Institute in Electronics.
GPU: Graphics Processing Unit.
GUI: Graphical User Interface.
ICA: Independent Component Analysis.
JADE: Joint Approximate Diagonalization of the Eigen-Matrices.
MAP: Maximum A Posteriori Probability.
MSE: Mean-Square-Error.
NSR: Noise to Signal Ratio.
OTF: Optical Transfer Function.
PSF: Point Spread Function.
vii
CONTENTS
PAGE
DECLARATION................................................................................................... iii
DEDICATION ...................................................................................................... iv
ACKNOWLEDGEMENTS ................................................................................... v
ABSTRACT. ......................................................................................................... vi
GLOSSARY. ........................................................................................................ vii
CONTENTS. ....................................................................................................... viii
LIST OF FIGURES .............................................................................................. xi
CHAPTER 1
PROJECT OVERVIEW ........................................................................................... 1
1.1
INTRODUCTION ............................................................................... 1
1.2
Problem Statement............................................................................... 2
1.3
Methodology ....................................................................................... 2
1.4
Assumptions ........................................................................................ 2
1.5
Delimitations ....................................................................................... 3
1.6
Contributions ....................................................................................... 3
1.7
Document Plan .................................................................................... 4
1.7.1
Chapter One ........................................................................................ 4
1.7.2
Chapter Two ........................................................................................ 4
1.7.3
Chapter Three ...................................................................................... 4
1.7.4
Chapter Four........................................................................................ 4
1.7.5
Chapter Five ........................................................................................ 4
CHAPTER 2
ALGORITHMS ....................................................................................................... 5
2.1
PREVIOUS WORK IN ATMOSPHERIC TURBULENCE ................. 5
2.1.1
Speckle Imaging .................................................................................. 5
2.1.2
Friedens’s Method ............................................................................... 7
2.1.3
Fusion ................................................................................................. 8
2.1.4
WFS (Wave-Front Sensing) ................................................................. 9
viii
2.2
ALGORITHMS SELECTED FOR COMPARISON ...........................10
2.2.1
Time-Averaged Algorithm..................................................................10
2.2.1.1
Lucas-Kanade Algorithm ....................................................................11
2.2.2
First Register Then Average and Subtract ...........................................14
2.2.2.1
FATR .................................................................................................14
2.2.2.2
FRTAAS ............................................................................................14
2.2.2.3
Elastic Image Registration ..................................................................18
2.2.3
Independent Component Analysis.......................................................22
2.2.4
Restoration of Atmospheric Turbulence Degraded Video
using Kurtosis Minimization and Motion Compensation .....................27
2.2.4.1
Control Grid Interpolation ..................................................................27
2.2.4.2
Compensation .....................................................................................28
2.2.4.3
Median using fixed period enhancement .............................................32
2.2.4.4
Kurtosis minimization ........................................................................32
2.3
CONCLUSION ..................................................................................36
CHAPTER 3
ATMOSPHERIC TURBULENCE ..........................................................................38
3.1
SIMULATING ATMOSPHERIC TURBULENCE.............................38
3.1.1
Blurring ..............................................................................................39
3.1.2
Geometric distortion ...........................................................................39
3.2
QUASI-PERIODICITY OF ATMOSPHERIC
TURBULENCE..................................................................................43
3.3
GRAPHICAL USER INTERFACE ....................................................45
3.4
CONCLUSION ..................................................................................46
CHAPTER 4
DATASETS, RESULTS AND COMPARATIVE ANALYSIS ...............................47
4.1
EXPERIMENTAL SETUP .................................................................47
4.2
RESULTS USING SIMULATED SEQUENCES ...............................48
4.2.1
Simulated sequences without motion ..................................................48
4.2.2
Simulated sequences with motion .......................................................55
4.3
RESULTS USING REAL SEQUENCES ...........................................58
ix
4.3.1
Real turbulence-degraded sequences without motion ..........................58
4.3.2
Real turbulence-degraded sequences with motion ...............................69
4.3.3
Sharpness of real turbulence-degraded sequences ...............................70
4.4
CONCLUSION ..................................................................................76
CHAPTER 5
CONCLUSION AND FUTURE WORK.................................................................77
5.1
CONCLUSION ..................................................................................77
5.2
FUTURE WORK ...............................................................................78
BIBLIOGRAPHY .................................................................................................79
APPENDIX A: FRTAAS Matlab code ...................................................................86
APPENDIX B: ICA Matlab code ......................................................................... 144
APPENDIX C: CGI Matlab code ......................................................................... 152
APPENDIX D: Wiener Filter and Kurtosis Matlab code ...................................... 156
APPENDIX E: General Algorithm Matlab code................................................... 159
APPENDIX F: Warping Algorithm Matlab code ................................................. 168
APPENDIX G: Graphical User Interface Matlab code ......................................... 170
APPENDIX H: General Algorithm C code .......................................................... 178
APPENDIX I: CGI Algorithm C code ................................................................. 182
x
LIST OF FIGURES
PAGE
Figure 2.1: (a) Original Image, (b) Simulated image, (c) Flow field, (d)
Time averaged frame and (e) Corrected frame. ...................................12
Figure 2.2: (a) Original Image, (b) Simulated Image, (c) Motion Blurred
Average and (d) Incorrectly Registered Image. ...................................13
Figure 2.3: (a) to (t) Frames from Number plate sequence. (r) selected as
sharpest frame. ...................................................................................16
Figure 2.4: Graph showing sharpness levels of sequence in Fig 2.3. .....................16
Figure 2.5: (a) Distorted frame 1, (b) Distorted frame 2, (c) & (d) Shift
maps, (e) estimated warp between frames and (f) Frame 1
warped to frame 2. ..............................................................................21
Figure 2.6: 10 frames from a simulated Lenna sequence. ......................................21
Figure 2.7: 10 corrected frames corresponding to Fig 2.6 using FRTAAS.............22
Figure 2.8: (a), (b) & (c) 3 turbulent frames, (d) Extracted Source Image,
(e) & (f) Turbulent spatial patterns, (g) Time averaged frame
and (h) Extracted source image ...........................................................25
Figure 2.9: ICA applied to video sequences ..........................................................26
Figure 2.10: ICA applied to Building site sequence ................................................26
Figure 2.11: (a) Simulated Lenna frame 1, (b) CGI motion field between
(a) and (c) and (c) Simulated Lenna frame 2. ......................................28
Figure 2.12: Motion fields used in trajectory estimation with a time
window of 5 frames ............................................................................30
Figure 2.13: 10 frames from a simulated Lenna sequence .......................................31
Figure 2.14: 10 corrected frames corresponding to Fig 2.13 using CGI
algorithm ............................................................................................31
Figure 2.15: Lenna sequence where turbulence blur is increased linearly ................33
Figure 2.16: Kurtosis measurements of sequence in Fig 2.15 ..................................33
Figure 2.17: (a) Original Lenna, (b) Blurred Lenna (λ=0.001) and (c)
Restored Lenna (λ=0.001) ..................................................................34
Figure 2.18: Graph showing normalized kurtosis of sequence in Fig 2.17.
λ=0.001 ..............................................................................................35
Figure 2.19: Real Turbulence degraded sequence ...................................................35
Figure 2.20: Restored sequence using CGI and kurtosis algorithm ..........................36
xi
Figure 3.1: (a) Original Lenna image, (b) Image blurred with λ=0.00025,
(c) Image blurred with λ=0.001 and (d) Image blurred with
λ=0.0025.............................................................................................39
Figure 3.2: (a) Checkerboard Image, (b) Checkerboard image warped in
x-direction, (c) Checkerboard image warped in y-direction
and (d) Final warp ..............................................................................41
Figure 3.3: (a) Real turbulence degraded image, (b) Flow field obtained
from (a), and (c) Simulated geometric distortion using flow
field ....................................................................................................42
Figure 3.4: (a), (b) & (c) 3 frames from simulated Lenna sequence with
blurring and geometric distortion ........................................................42
Figure 3.5: Motion of a pixel in a real turbulence sequence...................................44
Figure 3.6: Pixel wander for simulated Lenna sequence ........................................45
Figure 3.7: GUI for simulating atmospheric turbulence ........................................46
Figure 4.1: MSE of Lenna sequence with λ=0.001 and pixel motion set to
5 .........................................................................................................50
Figure 4.2: MSE of Flat sequence with λ=0.001 and pixel motion set to 5 ............50
Figure 4.3: MSE of Satellite sequence with λ=0.001 and pixel motion set
to 5 .....................................................................................................51
Figure 4.4: MSE of Girl1 sequence with λ=0.001 and pixel motion set to
5 .........................................................................................................51
Figure 4.5: MSE of Lenna sequence with λ=0.0025 and pixel motion set
to 3 .....................................................................................................52
Figure 4.6: MSE of Flat sequence with λ=0.0025 and pixel motion set to
3 .........................................................................................................53
Figure 4.7: MSE of Military sequence with λ=0.0025 and pixel motion
set to 3 ................................................................................................53
Figure 4.8: MSE of Room sequence with λ=0.00025 and pixel motion set
to 5 .....................................................................................................54
Figure 4.9: MSE of Lenna sequence with λ=0.00025 and pixel motion set
to 5 .....................................................................................................55
Figure 4.10: 3 frames from simulated motion sequence ..........................................55
Figure 4.11: MSE of Fixed Window CGI and Fixed Window CGI using
Median on simulated motion sequence 1 .............................................56
Figure 4.12: MSE of simulated motion sequence 1 with λ=0.001 and pixel
motion set to 5 ....................................................................................57
xii
Figure 4.13: MSE of simulated motion sequence 2 with λ=0.001 and pixel
motion set to 5 ....................................................................................57
Figure 4.14: MSE between consecutive frames of Armscor sequence .....................59
Figure 4.15: Real turbulence degraded frame of Armscor building .........................59
Figure 4.16: CGI corrected frame of Armscor building ...........................................60
Figure 4.17: FRTAAS corrected frame of Armscor building...................................60
Figure 4.18: Time-averaged corrected frame of Armscor building ..........................61
Figure 4.19: ICA corrected frame of Armscor building ...........................................61
Figure 4.20: Real turbulence degraded frame of building site sequence at a
distance of 5km ..................................................................................62
Figure 4.21: MSE between consecutive frames of Building site sequence ...............63
Figure 4.22: MSE between consecutive frames of Tower sequence ........................64
Figure 4.23: (a) Real turbulence-degraded frame of a tower at a distance
of 11km and (b) same tower at 11km but with negligible
turbulence ...........................................................................................65
Figure 4.24: (a) Frame from CGI algorithm output sequence and (b) frame
from FRTAAS algorithm ....................................................................66
Figure 4.25: (a) Frame from Time-averaged algorithm output sequence
and (b) frame from ICA algorithm ......................................................67
Figure 4.26: Real turbulence-degraded frame of a shack at a distance of
10km ..................................................................................................68
Figure 4.27: MSE between consecutive frames of Shack sequence .........................68
Figure 4.28: MSE between consecutive frames of Building site sequence
with motion ........................................................................................69
Figure 4.29: Sharpness of frames in Shack sequence using CGI algorithm..............70
Figure 4.30: Sharpness of frames in Shack sequence using CGI algorithm
with kurtosis enhancement ..................................................................71
Figure 4.31: Sharpness of frames in Shack sequence using Time-averaged
algorithm ............................................................................................71
Figure 4.32: Sharpness of frames in Shack sequence using ICA algorithm..............72
Figure 4.33: Sharpness of frames in Shack sequence using FRTAAS
algorithm ............................................................................................72
Figure 4.34: Sharpness of frames in Building site sequence using Timeaveraged algorithm .............................................................................73
Figure 4.35: Sharpness of frames in Building site sequence using ICA
algorithm ............................................................................................74
xiii
Figure 4.36: Sharpness of frames in Building site sequence using
FRTAAS algorithm ............................................................................74
Figure 4.37: Sharpness of frames in Building site sequence using CGI
algorithm with Kurtosis enhancement .................................................75
Figure 4.38: Sharpness of frames in Building site sequence using CGI
algorithm ............................................................................................75
xiv
CHAPTER 1
PROJECT OVERVIEW
1.1
INTRODUCTION
Atmospheric turbulence imposes limitations on sensors used to record image sequences
over long distances. The resultant video sequences appear blurred and waver in a quasiperiodic fashion. This poses a significant problem in certain fields such as astronomy and
defence (surveillance and intelligence gathering) where detail in images is essential.
Hardware methods proposed for countering the effects of atmospheric turbulence such as
adaptive optics and DWFS (Deconvolution from Wave-Front Sensing) require complex
devices such as wave-front sensors and can be impractical. In many cases image
processing methods proved more practical since corrections are made after the video is
acquired [1, 3, 10, 13, 18]. Heat scintillation can therefore be removed for any existing
video independent of the cameras used for capture.
Numerous image processing methods have been proposed for the compensation of blurring
effects. Fewer algorithms have been proposed for the correction of geometric distortions
induced by atmospheric turbulence. Each method has its own set of advantages and
disadvantages.
In this dissertation the focus is placed on comparing image processing methods proposed
to restore video sequences degraded by heat scintillation. The comparative analysis will be
followed by selecting the best method which is suited for real-time implementation. An
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 1
algorithm, developed to simulate the effects of atmospheric turbulence, is presented and a
GUI (Graphical User Interface) is developed.
1.2
PROBLEM STATEMENT
The purpose of this project is to perform a comparative analysis of algorithms developed to
restore sequences degraded by the effects of atmospheric turbulence with the focus placed
on the removal of heat scintillation.
1.3
METHODOLOGY
Results in the dissertation were obtained using datasets divided into two categories: Real
datasets and simulated datasets. The real datasets consist of sequences obtained in the
presence of real atmospheric turbulence. These datasets were obtained from the CSIR
(Council for Scientific and Industrial Research) using their Cyclone camera and vary in
range from 5km-15km. The simulated sequences were generated using ground truth
images/sequences. Both datasets can be further divided into sequences with real-motion
and sequences without real motion.
1.4
ASSUMPTIONS
The motion due to atmospheric turbulence is assumed to be small compared to the motion
of objects in the scene or motion caused by the camera such as panning and zooming. The
effect of atmospheric turbulence is taken to be either random at each pixel but highly
correlated or spatially local and temporally quasi-periodic depending on the algorithm.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 2
1.5
DELIMITATIONS
This work is limited to the implementation and comparison of different algorithms for the
correction of atmospheric turbulence in images:
• The algorithms selected will only focus on post-processing of the sequences.
• Real motion as well as atmospheric motion will be considered in the comparative
analysis. This will however be restricted to motion in which the camera is
stationary but the objects within the scene need not be. Panning and zooming will
therefore not be considered.
• The algorithms chosen will focus on recent work in which the main consideration
will be the correction of geometric distortions as well as their ability to minimise
and correct for the blurring induced by turbulence.
1.6
CONTRIBUTIONS
•
An algorithm is developed to simulate the effects of atmospheric turbulence and a
GUI is created to easily visualise atmospheric turbulence and create datasets.
•
The CGI (Control Grid Interpolation) algorithm was modified to use the median,
instead of the mean of the trajectory of a pixel, allowing a fixed period to be
maintained while showing improved results in the presence of real-motion in a
scene.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 3
1.7
DOCUMENT PLAN
The dissertation consists of five chapters organised as follows:
1.7.1 Chapter One
This chapter is an introduction to the project and contains the problem statement,
methodology, assumptions and delimitations.
1.7.2 Chapter Two
Chapter two deals with the literature review on both post-processing techniques as well as
hardware methods for correcting atmospheric turbulence. Most of the literature discussed
applies to the correction of the blurring induced by turbulence. The algorithms chosen for
comparison are presented in detail as well as their advantages and disadvantages.
1.7.3 Chapter Three
The algorithm proposed for the simulation of atmospheric turbulence used in this
dissertation is presented. The quasi-periodicity of atmospheric turbulence is also discussed.
1.7.4 Chapter Four
Chapter four focuses on the datasets, the results and a discussion of the results. The realtime simulation, in OpenCV, of two of the selected algorithms is discussed.
1.7.5 Chapter Five
The conclusion is presented and future work is outlined.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 4
CHAPTER 2
ALGORITHMS
The following chapter presents previous work in reducing the effects of atmospheric
turbulence as well as the algorithms selected for comparison. The previous works
discussed focus mainly on dealing with the blurring caused by atmospheric turbulence, as
the bulk of the research completed has been in this area. The algorithms chosen for
comparison are presented in detail. These algorithms were selected based on post
processing of the turbulence as well as their ability to compensate and/or minimise both the
distortion effects and the blurring caused by turbulence.
2.1
PREVIOUS WORK IN ATMOSPHERIC TURBULENCE
Sections 2.1.1 to 2.1.4 outline current methods available in reducing the effects of
atmospheric turbulence. It also looks at hardware methods of dealing with turbulence such
as adaptive optics.
2.1.1 Speckle Imaging
Speckle imaging is the process of reconstructing an object through the use of a series of
short exposure images. This is usually achieved by estimating the Fourier transform, phase
and magnitude, of the object. The phase and magnitude are handled separately. Some of
the methods proposed using speckled imaging are Knox-Thompson [15, 25] and Labeyrie
[15, 26] methods.
Labeyrie made the observations that speckles in short exposure images contain more high
spatial frequency information of an object than long exposure images. Therefore by using
the short exposure images more detail can be extracted from the images. Using a large
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 5
number of short exposure images, the energy spectrum of an object is estimated. This is
commonly referred to as speckle interferometry. In estimating the modulus of the Fourier
transform, required to obtain the object energy spectrum, the phase of the object is lost.
The phase spectrum will be required to create an image. Labeyrie’s method can be outlined
as follows:
Labeyrie Method (Speckle Interferometry)
1. Obtain N number of short exposure images of the object as well as of a reference
point.
2. Determine the Fourier transform of the image.
3. Determine the modulus squared.
4. Repeat steps 2 and 3 for all N images.
5. Determine average of modulus squared.
6. Deconvolute to obtain the energy spectrum of the object.
To obtain the phase spectrum the Knox-Thompson, or cross-spectrum, method can be
used. The cross-spectrum is a specialised moment of the image spectra which contain
information about the phase of the object [15]. The cross-spectrum can therefore be used to
recover the phase of the object.
The main problem of speckle imaging is the requirement of a reference point or reference
images. The method is well suited to astronomy where reference images can be obtained.
Another problem is that a large amount of short-exposure images are required to achieve
good results.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 6
2.1.2 Frieden’s Method [20]
Frieden’s method deals with the problem of imaging through turbulence by making use of
blind deconvolution. Blind deconvolution is used when no information about the distortion
of the image is known. It is capable of restoring the image as well as its point spread
function. The estimation of the PSF (Point Spread Function) is of vital importance as
choosing the incorrect one will lead to the restoration being unsuccessful.
Unlike the other methods discussed, Frieden’s approach only requires two short-exposure
images instead of a number of frames from a video sequence. No reference point sources
are required as is needed in speckle imaging. It uses the two short exposure frames to
estimate the point spread functions. This is achieved by finding the Fourier transforms of
the two images and then dividing by the same two images as shown in (1)
Dn ≡
In
(1)
In
( 2)
=
τ n (1) On τ n (1)
=
τ n ( 2 ) On τ n ( 2 )
(1)
where I represents the observed image spectra’s, τ represents the OTF’s (Optical Transfer
Function) which have to be estimated and O represents the unknown object spectrum.
From (1) it can be seen that for the division of the images to eliminate the unknown
spectrum of the object, there can be no motion present in the scene. Using the division of
the two unknown OTF’s, a set of n linear equations can be generated to give a solution to
the unknown OTF’s. Once the point spread functions have been estimated the blind
deconvolution algorithm can be used to correct the atmospheric turbulence in the image.
This method makes a number of assumptions, the first being that no additive noise is
present in the images. The presence of 1% additive Gaussian noise in the images degraded
the quality of the PSF’s significantly. The second assumption made is that there is no
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 7
motion present in the scene. The method does not address the problem of distortion caused
by turbulence and only deals with blurring.
2.1.3 Fusion
Image fusion has also been proposed to enhance images blurred by atmospheric
turbulence. Typically fusion refers to the extraction of information spontaneously adopted
in several domains [23]. However fusion has also been used to obtain a less degraded
image of a scene by using a single sensor to obtain several images of the scene, making it
suitable for atmospheric turbulence. The degradations could be caused by motion in the
scene, noise, incorrect focus as well as atmospheric turbulence.
Zhao [18] made use of this by using image fusion to compensate for photometric variations
caused by turbulence. The algorithm proposed by Zhao can be outlined as follows [18]:
Zhao’s Method (Fusion)
1. The source images are decomposed using a Laplacian pyramid.
2. Weight computation based on a salient pattern is computed at each level.
3. The image is reconstructed from level N to 0 using the weights to combine all
source pyramids at the current level.
The energy of the local Laplacian pattern was used as a salience measure. The method by
Zhao also provided a method of compensating for the geometric distortion by using a
reference frame which is selected manually. This is further discussed in section 2.2.1 under
the Time-Averaged Algorithm. The method proposed by Zhao requires all motion in the
scene, both real and turbulent, to be registered.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 8
2.1.4 WFS (Wave-Front Sensing)
A wave-front sensor is capable of measuring the phase perturbation in each short exposure
image. This can be used in two ways to correct for atmospheric turbulence.
The first method would be in an adaptive optics system in which the wave-front sensor is
used to control a deformable mirror. In this system the AOI (Adaptive Optics Imaging)
system will require three main components: WFS, Controller and a deformable mirror. The
WFS is used to measure the phase perturbations. These measurements are then used by the
controller to manipulate the deformable mirror. The deformable mirror is then the means in
which the wave front is corrected [15]. A deformable mirror is any unit that is capable of
changing the perturbed wave such as a tip-tilt mirror. These mirrors are segmented and
controlled by actuators to manipulate the wave front. This method of correcting for
turbulence requires complex devices i.e. deformable mirrors and wave-front sensors which
are difficult to obtain and extremely expensive.
The second method is a hybrid imaging technique that uses a wave-front sensor as well as
post-processing techniques to compensate for turbulence. The method is known as DWFS
(Deconvolution from Wave-Front Sensors). In this method the measurements obtained
from the WFS are used to estimate an OTF for the current short exposure image. This OTF
is then used to correct the short-exposure image through deconvolution [15]. While this
method still requires WFS for the phase measurements, the deformable mirrors are not
required and is therefore less complex than an adaptive optics system.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 9
2.2
ALGORITHMS SELECTED FOR COMPARISON
Four groups of algorithms were chosen for comparison. The algorithms chosen are based
on post processing of the turbulence as well as their ability to compensate and/or minimise
both the distortion effects and the blurring caused by turbulence. Sections 2.2.1 to 2.2.4
outline the background of the algorithms as well as their respective advantages and
disadvantages.
2.2.1 TIME-AVERAGED ALGORITHM
The Time-averaged algorithm is based on common techniques and components used in a
number of algorithms for correcting atmospheric turbulence [3, 11, 18]. This technique
divides heat scintillation into two separate steps i.e. distortion and blurring. Each step is
then dealt with individually. The first step uses some form of image registration to bring
the images into alignment and compensate for the shimmering effect. The alignment is
usually done against a reference frame. The second step deals with the blurring induced by
atmospheric turbulence. This is usually compensated for by making use of a blind
deconvolution algorithm or by using image fusion.
Image registration is performed for each frame with respect to a reference frame. This
provides a sequence that is stable and geometrically correct. The reference frame can be
selected by using a frame from the sequence with no geometric distortion and minimal
blurring. This is however impractical since the frame would have to be selected manually
and the probability of finding an image that has both minimal distortion and is
geometrically correct is unlikely. A more practical approach to selecting a reference frame
would be the temporal averaging of a number of frames in the sequence. Since atmospheric
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 10
turbulence can be viewed as being quasi-periodic, averaging a number of frames would
provide a reference frame that is geometrically improved, but blurred.
For the purpose of registration, an optical flow algorithm as proposed by Lucas and
Kanade [2] was implemented.
2.2.1.1. Lucas-Kanade Algorithm
The motion of a pixel from one frame to another can be described as
I ( x , y , t ) = I ( x + δ x, y + δ y, t + δ t )
(2)
where I(x,y,t) represents the intensity of a pixel, x and y represents the co-ordinates of a
pixel and t represents the frame number. The assumption is made that the intensity of the
object remains constant. Expanding (2) using a Taylor series we get
I ( x + δ x, y + δ y, t + δ t ) = I ( x, y, t ) +
∂I
∂I
∂I
δ x+ δy+ δ t
δx
δy
δt
(3)
where all higher order terms can be discarded. Since there are two unknowns (δx, δy) and
only one equation, it is an ill-posed problem. By assuming that the optical flow is locally
constant within a small, n x n patch, additional equations can be obtained. A least squares
method can then be used to solve the over-determined system:
 I x1
I
 x2
 M

 I x n
where
I y1 
I y 2 
M 

I y n 
 − I t1 


Vx   − I t 2 
V  =  M 
 y


− I t n 
(4)
∂I ∂I
∂I
and
are denoted as Ix, Iy and It respectively.
,
∂x ∂y
∂t
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 11
The Lucas-Kanade algorithm was implemented using a coarse-to-fine iterative strategy
achieved through an image pyramid.
Figure 2.1 shows the time-averaged algorithm applied to a distorted Lenna sequence.
(a)
(b)
(d)
(c)
(e)
Figure 2.1: (a) Original Image, (b) Simulated image, (c) Flow field,
(d) Time averaged frame and (e) Corrected frame.
The reference frames were generated by averaging the first N frames of the turbulence
degraded sequences. Using time-averaging to generate a reference frame works well when
there is no real motion present in the scene, however if real motion is introduced, the
averaging of the sequence will generate a reference frame that is motion blurred and worse
than the turbulence-degraded frames. Using this reference frame to register the sequence
will further degrade the sequence. This is illustrated in Figure 2.2.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 12
(a)
(b)
(c)
(d)
Figure 2.2: (a) Original Image, (b) Simulated Image, (c) Motion Blurred Average and (d)
Incorrectly Registered Image. (PETS 2000 Dataset [45]).
The algorithm performs well when there is no real motion present in the scene i.e. objects
moving, panning and zooming of camera. The video sequence is stabilized, except for a
few discontinuities caused by the optical flow calculations and/or the warping algorithm.
Localized blur will be present due to the averaging of the frames to obtain a reference
frame and this hinders the registration algorithm. When real motion is present in the scene
the reference frame is degraded due to motion blur. Warping any frame towards the
reference frame will cause further distortions and the restored sequence will be degraded to
a greater extent than the turbulence sequence.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 13
2.2.2 FIRST REGISTER THEN AVERAGE AND SUBTRACT
The FRTAAS (First Register Then Average and Subtract) algorithm is an improvement of
the FATR (First Average Then Register) algorithm, proposed by Fraser, Thorpe and
Lambert [3]. The FATR algorithm is very similar to the Time-averaged algorithm
discussed in section 2.2.1. The FRTAAS algorithm aims to address the problem of
localized blur by minimizing the effect of the averaging process used to create the
reference frame.
2.2.2.1 FATR
The FATR algorithm registers each frame in the image sequence against an averaged
reference or prototype frame. The registration technique used in [3] employed a
hierarchically shrinking region based on the cross correlation between two windowed
regions. To obtain improved results the dewarped frames are then averaged once again to
obtain a new reference frame and the sequence is put through the algorithm once again. As
discussed in section 3.1 the blur due to the temporal averaging will still be present. The
FRTAAS algorithm aims to address this problem.
2.2.2.2 FRTAAS
In FRTAAS the averaging approach used to create the reference frame in FATR is avoided
by allowing any one of the frames in a sequence to be the reference frame. However due to
the time varying nature of atmospheric turbulence, some of the frames in the sequence will
not be as severely degraded as others. This would mean that it would be possible to obtain
a reference frame in which the atmospheric induced blur would be minimal. A sharpness
metric is used to select the least blurred frame in the sequence. This frame can also be
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 14
selected manually. The distortion of the frame is not considered when selecting a reference
frame. The sharpness metric used to select the sharpest frame is
S h = − ∫ g ( x, y ) ln[ g ( x, y )]dxdy
(5)
where g(x,y) represents the image and x, y represent pixel co-ordinates.
Figure 2.3 shows 20 frames from a real turbulence-degraded sequence. Visually it can be
seen that the 18th frame in the sequence is the sharpest as the number plate is more clearly
visible. The graph in Figure 2.4 shows that the sharpness metric has selected the 18th frame
as the sharpest which corresponds to what is observed visually.
(a)
(b)
(c)
(d)
(e)
(f)
(g)
(h)
(i)
(j)
(k)
(l)
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 15
(m)
(n)
(q)
(r)
(o)
(s)
(p)
(t)
Figure 2.3: (a) to (t) Frames from Number plate sequence. (r) selected as sharpest frame.
(CSIR Dataset).
Figure 2.4: Graph showing sharpness levels of sequence in Fig 2.3.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 16
Once the sharp but distorted frame is selected from the video sequence it is used as the
reference frame. All frames in the sequence are then warped to the reference frame. The
shift maps that are used to warp the frames in the sequence to the reference frame are then
used to determine the truth image. In the FATR method the truth image was obtained by
temporal averaging. However by instead averaging the shift maps used to register the
turbulent frames to the warped reference frame, a truth shift map which warps the truth
frame into the reference frame is obtained. The averaging of the shift maps can be used
because, as in the case of temporal averaging to obtain a reference frame, atmospheric
turbulence can be viewed as being quasi-periodic.
The warping using the shift maps, xs and ys, can be described as
r ( x, y , t ) = g ( x + xs ( x, y , t ), y + y s ( x, y , t ), t )
(6)
representing a backward mapping where r(x,y,t) is the reference frame and g(x,y,t) is a
distorted frame from the sequence. Once the shift maps, xs and ys, have been obtained for
each frame in the sequence, the centroids, Cx and Cy, which are used to calculate the pixel
locations of the truth frame, can be determined by averaging:
C x ( x, y ) =
1
N
1
C y ( x, y ) =
N
N
∑ x ( x, y , t )
s
t =1
N
∑ y ( x, y, t ).
(7)
s
t =1
It is important to note that since the warping represents a backward mapping, the shift
maps obtained does not tell us where each pixel goes from r(x,y,t) to g(x,y,t) but rather
where each pixel in g(x,y,t) comes from in r(x,y,t) . Therefore the inverse of Cx and Cy are
then calculated and used to determine the corrected shift map of each warped frame in the
sequence as
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 17
−1
C x ( x, y ) = −C x ( x − C x ( x, y, t ), y − C y ( x, y, t ))
−1
C y ( x, y ) = −C y ( x − C x ( x, y, t ), y − C y ( x, y, t ))
−1
−1
−1
X s ( x, y, t ) = C x ( x, y ) + x s ( x + C x ( x, y ), y + C y ( x, y ), t )
−1
−1
−1
Ys ( x, y, t ) = C y ( x, y ) + y s ( x + C x ( x, y ), y + C y ( x, y ), t )
(8)
where Xs and Ys are the corrected shift maps used to correct the frames in the original
warped sequence [13].
Using Xs and Ys one is therefore able to obtain the geometrically improved sequence using
f ( x, y, t ) = g ( x + X s ( x, y , t ), y + Ys ( x, y , t ), t ).
(9)
2.2.2.3 Elastic image registration
The registration was done by using a differential elastic image registration algorithm
proposed by Periaswamy and Farid [4].
The registration algorithm models the mapping between images as a locally affine but
globally smooth warp that explicitly account for variations in image intensities [4]. The
general representation of an affine transformation can be described as
[u
v 1] = [x
 a11
y 1] a 21
a31
a12
a 22
a32
0
0.
1
(10)
From this
f ( x, y, t ) = f (u , v, t − 1)
u = a11 x + a21 y + a31
v = a12 x + a22 y + a32
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
(11)
Page 18
where a31 and a32 represent a translation and the remaining coefficients represent the affine
parameters. The aij parameters are estimated locally within a small n x n patch, Q, by
minimizing
∑ [ f ( x, y , t ) − f ( a
11
x + a 21 y + a 31 , a12 x + a 22 y + a32 , t − 1)]2 .
(12)
x , y∈Q
This can be done by expanding (12) using the Taylor series expansion


∂f ( x, y, t )
∂f ( x, y , t )
∂f ( x, y, t )  
 f ( x, y, t ) −  f ( x, y, t ) + ( a11 x + a21 y + a31 − x)
+ ( a12 x + a22 y + a32 − y )
+ (t − 1 − t )
 

∂x
∂y
∂t
x , y∈Q 


∑
=


∂f ( x , y , t )
∂f ( x, y, t ) ∂f ( x, y, t )  
 f ( x, y, t ) −  f ( x, y, t ) + ( a11 x + a21 y + a31 − x )
+ ( a12 x + a22 y + a32 − y )
−
∑
 

∂x
∂y
∂t
x , y∈Q 


which simplifies to
2
 ∂f ( x, y , t )
∂f ( x, y, t )
∂f ( x, y, t ) 

 .
− (a11 x + a21 y + a31 − x )
− ( a12 x + a22 y + a32 − y )
∑
∂
t
∂
x
∂y
x , y∈Q 

(13)
Equation (13) can be minimized by differentiating with respect to the unknowns and
setting the result equal to zero. This will result in
−1
r 
rr  
r 
a =  ∑ cc T   ∑ ck 
 x , y∈Q   x , y∈Q 
(14)
where
r  ∂f ( x, y, t )
∂f ( x, y, t )
∂f ( x, y , t )
c = x
y
x
∂x
∂x
∂y

∂f ( x, y, t )
∂f ( x, y, t )
∂f ( x, y, t )
k=
+x
+y
∂t
∂x
∂y
r
a = a11 a 21 a31 a12 a 22 a 32
[
∂f ( x, y, t )
y
∂y
∂f ( x, y, t )
∂x
∂f ( x, y, t ) 

∂y

T
(15)
]
This will provide us with all the parameters, aij, required to define the affine warp [5].
The registration algorithm also accounts for intensity changes between images in which the
image brightness constancy assumption fails. By modifying (11) to include two additional
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 19
2
2
parameters for brightness and contrast, the registration algorithm is able to account for
variations in intensity.
a c f ( x, y , t ) + a b = f ( a11 x + a 21 y + a31 , a12 x + a 22 y + a32 , t − 1)
(16)
where ac and ab represent contrast and brightness [5]. This equation is then solved in a
similar fashion as (11) by minimizing the error function.
The final aspect of the algorithm deals with the addition of a smoothness constraint which
replaces the assumption of image brightness constancy. The assumption is made that the
parameters required vary smoothly across space [5]. This allows for a larger spatial
neighbourhood to be selected since the image brightness constancy assumption is no longer
used.
Figure 2.5 shows a selected reference frame (target) and the warping of a frame from a
simulated sequence (source) to the target frame. It also shows the estimated warp and the
shift maps.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 20
(a)
(b)
(c)
(d)
(e)
(f)
Figure 2.5: (a) Distorted frame 1, (b) Distorted frame 2, (c) & (d) Shift maps, (e) estimated
warp between frames and (f) Frame 1 warped to frame 2.
Figure 2.6 shows 10 frames from a simulated turbulent Lenna sequence. Figure 2.7 shows
the restored images, corresponding to the frames in Figure 2.6, using the FRTAAS
algorithm.
Figure 2.6: 10 frames from a simulated Lenna sequence.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 21
Figure 2.7: 10 corrected frames corresponding to Fig 2.6 using FRTAAS
The FRTAAS algorithm performed well with no motion present in the scene. The restored
sequences were an improvement over the Time-Averaged Algorithm. This was achieved by
avoiding temporal averaging of the turbulent frames. The algorithm also has problems in
dealing with real motion present in the scene.
2.2.3 INDEPENDENT COMPONENET ANALYSIS
ICA (Independent Component Analysis) belongs to a class of blind source separation
methods for separating data into their underlying informational components [8]. In the
algorithm proposed by Kopriva et al [10], the underlying data takes the form of images. By
treating the frames of the turbulent sequence as sensors and taking the turbulence spatial
patterns as sources along with the original frame, ICA can be applied to the sequence to
extract the sources from the turbulent frames.
The turbulent image frames can be represented as
I i = AI 0 + v
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
(17)
Page 22
where Ii is an N x T matrix of the turbulent frames. T=x x y where x and y are the
dimensions of the frames and I0 represents the original image. Therefore each image is
represented as a single 1 x T vector of intensity values. A is the unknown mixing matrix
which distorts the original frames to form the turbulent frames and v represents additive
noise
ICA aims to find a transformation matrix W that will separate the turbulent frames or
mixtures into source signals, i.e.
∧
I o = WI i .
(18)
For ICA to work it is assumed that the source signals are mutually statistically independent
since ICA will estimate W so that Îo will represent estimated source signals that are as
statistically independent as possible. Îo will then contain the scaled original signal and its
spatial turbulent patterns. The scaling is inherent in ICA algorithms.
In the work of Kopriva et al [10], a fourth-order cumulant-based ICA algorithm, JADE
(Joint Approximate Diagonalization of the Eigen-Matrices) as proposed by Cardoso [6],
was used to estimate the un-mixing matrix W. In JADE statistical independence is achieved
through the minimization of the squares of the fourth order cross-cumulants among the
components of Îo i.e.
∧


W = arg min ∑∑∑∑ off W T C ( I ij , I ik , I il , I im )W 


m
l
k
j
(19)
where off(A), for A = (a i j )1≤ i , j ≤ N , is defined as
off ( A) =
∑a
2
ij
1≤ i ≠ j ≤ N
(20)
and Ĉ(Iij , Iik , Iil , Iim) are sample estimates of the fourth-order cross-cumulants [10].
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 23
If the mixing matrix, A, is singular, the un-mixing matrix, W, which is the inverse of the
mixing matrix cannot be calculated. To prevent this, the algorithm measures the mutual
information between turbulent frames using the Kullback-Leibler divergence
D ( p, q ) = L( p, q ) + L(q, p )
T
where L( p, q ) = ∑ p k log 2
k =1
(21)
T
pk
q
, L(q, p ) = ∑ q k log 2 k , and pk and qk are pixel intensities
qk
pk
k =1
at the spatial coordinate k ≅ ( x, y ) . If two images are the same the distance D(p,q) will be
zero.
Figure 2.8 shows 3 turbulent frames from a simulated Lenna sequence applied to the ICA
algorithm. The extracted source image and turbulent spatial patterns are also shown.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 24
(a)
(b)
(d)
(c)
(e)
(g)
(f)
(h)
Figure 2.8: (a), (b) & (c) 3 turbulent frames, (d) Extracted Source Image, (e) & (f)
Turbulent spatial patterns, (g) Time averaged frame and (h) Extracted source image.
The algorithm proposed was modified to function with video sequences by using a frame
window size of three. At each iteration, the frame window was incremented by one to
include a new frame, thereby allowing the preservation of the sequence length as well as
ensuring that the mutual information, in most cases, would not be the same. This is
illustrated in Figure 2.9 and Figure 2.10.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 25
Frame 1
Frame 2
Frame 3
Frame 4
Frame 1
Frame 2
Frame 3
Frame 5
Figure 2.9: ICA applied to video sequences.
Figure 2.10: ICA applied to Building site sequence. (CSIR Dataset).
An alternate method used to apply the algorithm to video sequences was to use the
extracted source image from the current window set and apply this frame to the next
window set. This would allow us to always have a frame that is close to the source image
in the window set. This method however would cause the Kullback-Leibler divergence to
become zero frequently.
The ICA algorithm is advantageous because only a few frames are required to extract the
source frame and it performs better than the simple temporal averaging method since the
loss of details experienced with averaging is avoided. The disadvantages with the
algorithm are the assumptions that all motion has been compensated for and the turbulence
used for correction is classified as weak.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 26
2.2.4 RESTORATION OF ATMOSPHERIC TURBULENCE DEGRADED VIDEO
USING KURTOSIS MINIMIZATION AND MOTION COMPENSATION
In this algorithm, both effects of turbulence are addressed i.e. geometric distortion and
blurring. To compensate for the blurring induced by atmospheric turbulence, the kurtosis
of an image is used and for the geometric distortion, CGI (Control Grid Interpolation) is
used.
2.2.4.1 Control Grid Interpolation
Control grid interpolation is a method proposed by Sullivan [16] for motion compensation.
It is a technique used for performing spatial image transformations. An image is initially
segmented into small continuous square regions, the corners of which form control points.
These control points are used as anchors in which the intermediate vectors are calculated
using bilinear interpolation. CGI allows for the representation of complex motion making
it suitable for images distorted by atmospheric turbulence.
The pixel relationship between two images within a square region is described as
I1[i, j ] = I 0 [i + d1[i, j ], j + d 2 [i, j ]]
d1[i, j ] = α1 + α 2i + α 3 j + α 4ij
(22)
d 2 [i, j ] = β1 + β 2i + β 3 j + β 4ij
where i, j represent pixel co-ordinates and d1[i, j ] and d 2 [i, j ] represent the horizontal
and vertical displacement of the pixels between the two images I1 and I0. d1 [i, j ] and
d 2 [i, j ] are used to compute the vectors between the four control points enclosing each
region, R using bilinear interpolation. Given four points, (i0,j0), (i1,j1), (i2,j2), (i3,j3) any
intermediate coordinate X(i,j) may be computed using the expression
X [i, j ] = α1 + α 2i + α 3 j + α 4ij .
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
(23)
Page 27
Therefore once the α and β parameters have been determined for each region R, the
intermediate motion vectors can be calculated providing us with a dense motion field of the
turbulence.
The α and β parameters can be estimated within each region R by minimizing
∑ ( I [i, j] − I [i + d [i, j], j + d [i, j]])
0
1
1
2
2
.
(24)
[ i , j ]∈R
Using the Taylor series, (24) approximates to
∑ ( I [i, j ] − I [i, j ] −
0
[ i , j ]∈R
1
∂I1[i, j ]
∂I [i, j ]
d1[i, j ] − 2
d 2 [i, j ]) 2
∂j
∂i
(25)
with higher order terms discarded. Using the least squares method we can obtain the
bilinear parameters. Figure 2.11 shows an example of a motion field generated using CGI.
(a)
(b)
(c)
Figure 2.11: (a) Simulated Lenna frame 1, (b) CGI motion field between (a) and (c) and (c)
Simulated Lenna frame 2.
2.2.4.2 Compensation
To compensate for the distortion the trajectories of each pixel are calculated using the
motion vectors from the CGI algorithm. Two methods were proposed for calculating the
trajectories of the pixels. The first method calculates the trajectory between the current
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 28
frame and the previous frames trajectory estimate. This method is computationally efficient
since at each new frame in the sequence only the trajectory between the new frame and the
previous frame have to be calculated. This however also makes the method susceptible to
errors in the presence of noise since an error in the previous trajectory estimate will be
compounded in all succeeding frames. The trajectory of the first method can be calculated
as
T (i, j, t0 ) = (i, j )
T (i, j, t0 − 1) = T (i, j , t0 ) + vt 0 ,t 0−1 (T (i, j, t0 ))
M
M
M
T (i, j, t0 − n) = T (i, j, t0 − n + 1) + vt 0 − n +1, t 0 − n (T (i, j , t0 − n + 1))
(26)
where T represent the trajectory, v represent the motion vectors between two frames and t0
represents the source or initial frame.
The second method estimates the trajectory by using the motion vectors between a source
frame, which remains fixed, and a target frame that is changed. This significantly increases
the computational load since the motion vectors will have to be recalculated each time the
algorithm increments to a new frame. Since the previous trajectory estimates are not used,
the problem of errors in the presence of noise is avoided. The methods trajectory can be
calculated as
T (i, j, t 0 + n) = (i, j ) + vt0 ,t0 + n (i, j )
M
M
T (i, j, t 0 + 1) = (i, j ) + vt0 ,t0 +1 (i, j )
T (i, j, t 0 ) = (i, j )
(27)
T (i, j, t 0 − 1) = (i, j ) + vt0 ,t0−1 (i, j )
M
M
T (i, j, t 0 − n) = (i, j ) + vt0 ,t0 − n (i, j ).
This is illustrated in Figure 2.12.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 29
Frame (t0+2)
Frame (t0+1)
Frame (t0)
Frame (t0-1)
Frame (t0-2)
Figure 2.12: Motion fields used in trajectory estimation with a time window of 5
frames. (CSIR Dataset).
Using (27) we can compensate for the geometric distortion at frame t0 by calculating the
centroid of the trajectory as
1
Tˆ (i, j ) =
∑ T (i, j, k ) .
n + 1 t0 − n ≤ k ≤t 0
(28)
Since the motion due to atmospheric turbulence is quasi-periodic, the net displacement
over a period will be zero. Therefore by averaging the motion fields at each current frame,
a motion field can be generated which will allow us to dewarp the current frame. Since
motion due to atmospheric turbulence is small compared to real motion, using this method
will preserve the real motion in the scene.
Figure 2.13 shows 10 frames from a simulated turbulent Lenna sequence and Figure 2.14
shows the restored images, corresponding to the frames in Figure 2.13, using the CGI
algorithm.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 30
Figure 2.13: 10 frames from a simulated Lenna sequence.
Figure 2.14: 10 corrected frames corresponding to Fig 2.13 using CGI algorithm
The length of trajectory smoothing filter can be fixed, however by adjusting the length of
the smoothing filter, improved results can be obtained. The algorithm proposes a method
based on the characteristic that turbulent motion has zero mean quasi-periodicity. Using
this property the length of the smoothing filter is adjusted. This allows for improvements in
separating real motion and turbulent motion since when no real motion is present in the
scene the window length can be increased for improved results. If real-motion is present
the window length is decreased since the real motion will affect the trajectory estimation.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 31
The adaptive period enhancement performs significantly better than fixed period when the
camera is stationary and objects in the scene move. In cases of zooming and panning, the
difference is not significant. The computational complexity of using adaptive period
enhancement is also significantly increased making it less suitable for real-time
implementation. Therefore fixed period was used in our implementation.
2.2.4.3 Median using fixed period enhancement
For the purpose of real-time implementation a fixed period enhancement method was used
in this dissertation. The algorithm was however modified in the way the centroid of
trajectory is estimated. It was observed that by using the median of the trajectory instead of
the average, better results could be obtained over fixed-period enhancement without
increasing the computational complexity significantly. Since real motion is larger than
turbulent motion, by using the median the effect of the large motion vectors due to real
motion are minimised.
2.2.4.4 Kurtosis Minimization
To compensate for the blurring induced by atmospheric turbulence, the kurtosis of an
image is used. The kurtosis of a random variable is defined as the normalized fourth central
moment, i.e.
k=
E (( x − µ ) 4 )
σ4
(29)
where µ and σ represent the mean and standard deviation respectively. The kurtosis
measures the peakedness of distributions. A distribution with a kurtosis higher than 3 is
leptokurtic and with a kurtosis less than 3 is platykurtic. The Gaussian distribution has a
kurtosis of 3 and is called mesokurtic. By using the kurtosis of an image it was shown that
in general images which are blurred or smoothed have a higher kurtosis than the original
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 32
images. This is shown in Figure 2.15 and Figure 2.16. In certain cases the kurtosis of an
image will behave in the opposite manner i.e. kurtosis will decrease as the image is
blurred.
Figure 2.15: Lenna sequence where turbulence blur is increased linearly
Figure 2.16: Kurtosis measurements of sequence in Fig 2.15.
Using this property, the algorithm aims to optimize a parameter in a restoration filter. By
finding the parameter which corresponds to the lowest kurtosis the image can be restored.
This was shown to work for a number of different blurs such as Gaussian, out-of-focus and
linear motion blurs.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 33
For the case of restoring the atmospheric turbulence blurred images, the turbulence OTF
(32) was used. By estimating the parameter, λ, within a search space, deconvolution can be
used to restore the estimated original image. The deconvolution can be achieved by any
non-blind restoration algorithm but for our implementation, similar to [12], Wiener
filtering was used. The Wiener filter is defined as
G (u , v ) =
H * (u , v) X (u , v)
2
H (u , v ) + nsr
(30)
where nsr is the noise-to-signal ratio, H represents the degradation function and X
represents the blurred image.
Figure 2.17 shows an example of a simulated turbulence sequence with a λ of 0.001. The
graph plots the values of the normalized kurtosis versus the λ search space. As can be seen
a λ value of 0.001 has been selected as the minimum, which corresponds to the value used
to blur the image.
(a)
(b)
(c)
Figure 2.17: (a) Original Lenna, (b) Blurred Lenna (λ=0.001) and (c) Restored Lenna
(λ=0.001).
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 34
Figure 2.18: Graph showing normalized kurtosis of sequence in Fig 2.17. λ=0.001.
Figure 2.19 shows an example of a real turbulence sequence and Figure 2.20 shows the
image, first corrected for distortion and then enhanced using the kurtosis method.
Figure 2.19: Real Turbulence degraded sequence (CSIR Dataset).
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 35
Figure 2.20: Restored sequence using CGI and kurtosis algorithm. (CSIR Dataset).
The significant advantage of this algorithm is that it can restore turbulent degraded
sequences while preserving real motion. It also addressed both the geometric distortions
and blurring. Although the algorithm is computationally expensive, computational time can
be reduced by altering certain parameters such as fixing the length of the frames in the
trajectory estimation.
2.3
CONCLUSION
Popular methods for correcting the effects of atmospheric turbulence were discussed. Most
of the methods currently researched deal with the blurring caused by atmospheric
turbulence. Most of the algorithms selected for comparison have been shown to degrade
when real motion is present in the scene. The algorithm proposed by Li [1] has shown
good results in dealing with situations when both turbulent and real motion is present in the
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 36
scene. By using the median of the temporal window it was shown that the window length
could be kept constant and still allow for real motion and turbulent motion to be separated
with good results. Based on the results of a detailed analysis conducted in Chapter 4, realtime capabilities will be assessed.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 37
CHAPTER 3
ATMOSPHERIC TURBULENCE
Atmospheric turbulence is caused due to the index of refraction of air fluctuating with
changes in temperature. This causes objects in sequences to appear blurred and waver
slowly in a quasi-periodic fashion. The following chapter presents the methods used to
simulate atmospheric turbulence. The GUI developed to simplify the visualisation of
atmospheric turbulence and the creation of datasets is also presented.
3.1
SIMULATING ATMOSPHERIC TURBULENCE
Since atmospheric turbulence degraded images are not easily available, being able to
simulate atmospheric effects would be advantageous. This will also provide us with a set
of ground truth sequences allowing us to compare the original sequences with the
recovered sequences from the algorithms.
A turbulence degraded sequence g can be modelled as
g (i, j, t ) = D[ x(i, j, t ) * h(i, j , t ), t ] + η (i, j , t )
(31)
where * denotes two-dimensional convolution, i and j denote pixel co-ordinates at frame t,
η denotes time-varying additive noise, D denotes the turbulence induced time-varying
geometric distortion, h is the dispersive distortion component of the atmospheric
turbulence and x is the original video [1]. Based on (31) the effects of turbulence can be
divided into two categories, blurring and geometric distortion.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 38
3.1.1 Blurring
To simulate the effects of blurring, the OTF (optical transfer function) of atmospheric
turbulence as derived by Hufnagel and Stanley [1] is used. The OTF can be modelled as
H (u, v) = e − λ ( u
2
+ v 2 )5 / 6
(32)
where u, v represent the co-ordinates in the spatial frequency domain and λ controls the
severity of the blur [1]. Since turbulence blurring is time varying, the value of λ will have
to be varied from frame to frame, within a limit, to correctly simulate the effect of
atmospheric blurring. Typical values of λ would range from 0.00025 to 0.0025 to simulate
low to severe turbulence respectively. Figure 3.1 shows the Lenna image from blurred
λ=0.00025 to λ=0.0025.
(a)
(b)
(c)
(d)
Figure 3.1: (a) Original Lenna image, (b) Image blurred with λ=0.00025, (c) Image blurred
with λ=0.001 and (d) Image blurred with λ=0.0025.
3.1.2 Geometric Distortion
Two methods were used to simulate the geometric distortions induced by atmospheric
turbulence. The first method uses a 2-pass mesh warping algorithm [14] to randomly map
pixels from the source image to a destination image within a specified area. This creates a
sequence in which the scene appears to waver in a quasi-periodic fashion. This method
allows for full control of the level of distortion present in the sequences. It also allows for
the simulation of a large number of sequences each with its own distortion levels.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 39
The 2-pass mesh warping algorithm accepts a source image and two 2-D arrays of coordinates. The first array contains the co-ordinates of control points in the source image.
Since we are not interested in any particular points of interest in the case of atmospheric
turbulence, the first array is generated directly from the source image as a rectilinear grid.
The second array is used to specify the destination co-ordinates of the control points. This
array is generated using a random shift map that specifies pixel shift values at the control
points. Both the arrays are constrained to be topologically equivalent to prevent folding or
discontinuities in the destination image. This is achieved by limiting the shift values to
make certain that they do not wander so far as to cause self intersection.
Since the algorithm is separable the 1st pass is concerned with warping the source image
into an intermediate image in the horizontal direction. The 2nd pass will then complete the
warp by warping the intermediate image in the vertical direction. Figure 3.2 shows the 1st
pass, 2nd pass and final output of the 2-pass mesh warping algorithm applied to the
checkerboard image.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 40
(a)
(b)
(c)
(d)
Figure 3.2: (a) Checkerboard Image, (b) Checkerboard image warped in x-direction, (c)
Checkerboard image warped in y-direction and (d) Final warp
The second method used was to extract the motion fields directly from real turbulence
degraded video clips and then apply them to the frames of a turbulence free video clip [12].
While this gives us only a limited number of distortion levels it provides a more realistic
approach to the distortion effects of atmospheric turbulence. The sequences used for the
extraction of the turbulent motion fields were provided by the CSIR and extracted using
the Lucas-Kanade optical flow algorithm. Figure 3.3 shows an example of the process.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 41
(a)
(b)
(c)
Figure 3.3: (a) Real turbulence degraded image, (b) Flow field obtained from (a), and (c)
Simulated geometric distortion using flow field.
(Image (a) courtesy of the CSIR)
The final result of the blurring and the distortion applied to the Lenna sequence can be seen
in Figure 3.4.
(a)
(b)
(c)
Figure 3.4: (a), (b) & (c) 3 frames from simulated Lenna sequence with blurring and
geometric distortion.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 42
The complete algorithm for simulating atmospheric turbulence can be summarised as
follows:
Simulation Algorithm
1. Use the 2-pass mesh warping algorithm to simulate the distortion
effects.
2. Transform the images in the distorted sequence into the
frequency domain.
3. Multiply each frame Xt, where t represents the frame number,
with the OTF described by (32), varying λ between frames.
3.2
QUASI-PERIODICITY OF ATMOSPHERIC TURBULENCE
One of the key assumptions made in most of the algorithms discussed is that atmospheric
turbulence is quasi-periodic in nature. This means that the net displacement over a period
of time is approximately zero. To illustrate this, the motion of pixels from real-turbulence
degraded sequences was plotted.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 43
Figure 3.5: Motion of a pixel in a real turbulence sequence.
As can be seen from Figure 3.5, the pixel motion remains within a specified radius
showing the quasi-periodic nature of turbulence. The ‘+’ shows the location of the pixel in
the initial frame. The ‘*’ shows the average of the pixel co-ordinates and would correspond
to the estimated true location of the pixel in the initial frame. Using a simulated turbulence
sequence the value of the average co-ordinate of the pixel motion can be calculated and
this can be compared to the original location of the pixel since the truth image is available.
This can be seen in Figure3.6.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 44
Figure 3.6: Pixel wander for simulated Lenna sequence
3.3
GRAPHICAL USER INTERFACE
A GUI was developed in Matlab to manage the simulation of atmospheric turbulence and
simplify the process of creating datasets. The GUI allows you to select an input image for
processing. The distortion and blurring levels can be set and the processed sequence
viewed. Once a desired set of levels is selected, a sequence is processed according to the
number of frames required. The sequence can then be viewed in the GUI and saved. Figure
3.7 shows an example of the GUI.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 45
Figure 3.7: GUI for simulating atmospheric turbulence
3.4
CONCLUSION
The methods used in this dissertation for simulating the effects of atmospheric turbulence
were discussed and the quasi-periodic nature of atmospheric turbulence was shown. A GUI
developed for simulating turbulence was presented.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 46
CHAPTER 4
DATASETS, RESULTS AND COMPARATIVE ANALYSIS
Results in the dissertation were obtained using datasets divided into two categories: Real
datasets and simulated datasets. The real datasets consist of sequences obtained in the
presence of real atmospheric turbulence. These datasets were obtained from the CSIR
(Council for Scientific and Industrial Research) using their Cyclone camera and vary in
range from 5km to 15km. The simulated sequences were generated using ground truth
images/sequences. Both datasets can be further divided into sequences with real-motion
and sequences without real motion.
4.1
EXPERIMENTAL SETUP
The registration algorithms used in the CGI, FRTAAS and Time-averaged algorithms were
implemented to be as similar as possible to allow for accurate results to be obtained. A
window size of five was chosen for all the algorithms. The pyramid levels were also
chosen to be the same for both the Lucas-Kanade and Elastic Registration algorithm. On
average two pyramid levels were used.
For the CGI and Time-averaged algorithms a time window of ten frames was chosen. In
the case of the Time-averaged algorithm this meant averaging ten frames to obtain the
reference frame and in the case of the CGI algorithm a moving filter of ten frames was
used in the trajectory estimation. For the case of the ICA algorithm the best results were
obtained using a time window of three frames from which to estimate a true frame. For the
FRTAAS algorithm the entire sequence was allowed for the selection of the sharpest
frame.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 47
4.2
RESULTS USING SIMULATED SEQUENECES
The simulated sequences were used as they provided us with a ground truth with which to
compare the results of each algorithm. The simulated sequences can be sub-divided into
two further categories, sequences with motion and sequences without motion. For the
sequences without motion a single image was used and warped in different ways to create
a distorted sequence similar to turbulence. The distortions were set to be random within a
certain level of pixel shift that could be controlled. The sequence was then blurred using
Equation (32) with λ being selected randomly within a limit. This limit was chosen to be
small and was determined by multiplying λ with a random value between 0.5 and 1.5. The
final sequence was therefore a time-varying blurred and distorted sequence which
simulates turbulence. The turbulent sequences with motion were simulated by warping and
blurring each frame of a motion sequence using the same method described above.
4.2.1 Simulated sequences without motion
Figures 4.1-4.4 show the results of the four algorithms on a number of simulated
turbulence sequences with no motion. The sequences were generated using a medium level
of turbulence with an average λ=0.001. The level of distortion was set to a radius of
approximately five pixels, which is considered to be a medium level of distortion in this
dissertation.
The MSE (Mean-square-error) was calculated between each frame in the output sequence
of the algorithms and the original ground-truth frame. All of the output sequences showed
a definite reduction in the levels of geometric distortion. The FRTAAS algorithm showed
the best results visually which is confirmed by the MSE results. The CGI algorithm and the
Time-averaged algorithm performed similarly, with the CGI algorithm showing a slight
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 48
performance advantage. Since no motion is present in the scene the time-averaged
algorithm is able to generate a good reference frame through averaging. The outstanding
results obtained from the FRTAAS algorithm can be attributed to two main factors. The
first being the registration algorithm used. Since the registration algorithm accounts for
intensity variations as well as including a smoothness constraint which avoids the
constraints of image brightness constancy, better results can be obtained through
registration. The second factor is the sharpness metric used to select a sharp initial
reference frame which improves the results in the final output. The ICA algorithm is only
capable of compensating for a small amount of distortion in the turbulence sequence and
while there is a reduction in the output sequence when compared to the turbulence
sequence, it shows the least performance gain compared to the other three algorithms. The
reason for the CGI algorithm starting from frame six is the time required to accumulate
over the time window. It could have been allowed to start from frame one by reducing the
time window initially and increasing it once the target frame is reached but to get a more
accurate assessment this was not done.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 49
Figure 4.1: MSE of Lenna sequence with λ=0.001 and pixel motion set to 5.
Figure 4.2: MSE of Flat sequence with λ=0.001 and pixel motion set to 5.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 50
Figure 4.3: MSE of Satellite sequence with λ=0.001 and pixel motion set to 5.
Figure 4.4: MSE of Girl1 sequence with λ=0.001 and pixel motion set to 5.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 51
Figures 4.5-4.7 show the results of the simulated sequences with a higher level of
turbulence with a λ=0.0025 and the distortion level set to 3. This was done to see how the
algorithms performed with a small amount of distortion but an increased level of blur. It
can be seen that the CGI and FRTAAS algorithms performed similarly in this case. Since
the sequence has a higher level of blur, the sharpest frame selection does not provide a
significant advantage in this case. In different turbulence sequences, due to lucky selection
of a sharp frame, the FRTAAS algorithm might show improved results. The ICA algorithm
again showed the least improvement in performance. The time-averaged algorithm showed
improved results over the turbulence sequence but was still outperformed by the CGI and
FRTAAS algorithms.
Figure 4.5: MSE of Lenna sequence with λ=0.0025 and pixel motion set to 3.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 52
Figure 4.6: MSE of Flat sequence with λ=0.0025 and pixel motion set to 3.
Figure 4.7: MSE of Military sequence with λ=0.0025 and pixel motion set to 3.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 53
Figures 4.8-4.9 shows the results of the four algorithms on simulated turbulence sequences
with λ=0.00025. The level of distortion was set to a radius of approximately five.
Figure 4.8: MSE of Room sequence with λ=0.00025 and pixel motion set to 5.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 54
Figure 4.9: MSE of Lenna sequence with λ=0.00025 and pixel motion set to 5.
4.2.2 Simulated sequences with motion
For the simulated sequences with motion, the CGI algorithm was used with a fixed
window using the median method as described in section 2.2.4.3. The difference between
the CGI using fixed window and CGI using fixed window with the median is shown in
Figure 4.11. The results are from a sequence of a car entering a parking lot as shown in
Figure 4.10.
Figure 4.10: 3 frames from simulated motion sequence. (PETS 2000 Dataset [45]).
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 55
Figure 4.11: MSE of Fixed Window CGI and Fixed Window CGI using Median on simulated
motion sequence 1.
Figures 4.12-4.13 show the results of the four algorithms. The Time-averaged algorithm
broke down completely with motion present in the scene since the reference frame was
motion blurred. The ICA algorithm also showed signs of motion blur in the output
sequence and the results show that the output sequence was worse than the turbulencedegraded sequence in the first motion sequence. The FRTAAS algorithm showed similar
performance to the ICA algorithm. The CGI algorithm is the only algorithm which showed
an improvement in the output sequence with geometric distortions reduced and the real
motion preserved. Figure 4.13 shows a comparison of using the fixed window and the
fixed window with median. It can be seen that the fixed window using the median
performed slightly better.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 56
Figure 4.12: MSE of simulated motion sequence 1 with λ=0.001 and pixel motion set to 5.
Figure 4.13: MSE of simulated motion sequence 2 with λ=0.001 and pixel motion set to 5.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 57
4.3
RESULTS USING REAL SEQUENECES
The real turbulence degraded dataset consists of 11 sequences provided by the CSIR
(Council for Scientific and Industrial Research). The sequences vary from buildings and
structures, which contain a large amount of detail, to open areas in which the contrast can
be low. The ranges of the sequences are from 5km to 15km and were obtained using the
CSIR’s cyclone camera. The turbulence levels vary from light to severe with most of the
sequences having a medium level of turbulence as determined visually by an expert [47].
In the case of the real sequences, since no ground truth is available the sequences cannot be
compared with the original. The MSE (Mean-square-error) was calculated between
consecutive frames in a sequence, which shows the stability of the sequence. An intensity
corrected MSE will measure the differences between frames i.e. if turbulence is present the
geometric changes between frames will be large and this will correspond to a high MSE.
The sharpness of the frames was then calculated and is shown in section 4.3.3.
4.3.1 Real turbulence-degraded sequences without motion
Figure 4.14 shows the results of the real turbulence sequence taken of the Armscor
building at a distance of 7km. Examples of the turbulent and corrected frames are shown in
Figures 4.15-4.19. In this sequence there is a fair amount of detail present. The processed
sequences for all the algorithms showed a reduction in the geometric distortions. The CGI,
FRTAAS and the Time-averaged algorithms output a stable sequence with few to no
discontinuities. The ICA algorithm output showed a reduction in atmospheric turbulence
with the distortions appearing to move more slowly. The distortions were still however
present and the shimmering effect remained. This can be seen in Figure 4.14, where the
MSE of the ICA is always less than that of the turbulence sequence however its variations
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 58
are much higher. The CGI and Time-averaged algorithms show the best results for the
Armscor sequence. There is still however slight differences between the frames.
Figure 4.14: MSE between consecutive frames of Armscor sequence.
Figure 4.15: Real turbulence degraded frame of Armscor building. (CSIR Dataset).
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 59
Figure 4.16: CGI corrected frame of Armscor building. (CSIR Dataset).
Figure 4.17: FRTAAS corrected frame of Armscor building. (CSIR Dataset).
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 60
Figure 4.18: Time-averaged corrected frame of Armscor building. (CSIR Dataset).
Figure 4.19: ICA corrected frame of Armscor building. (CSIR Dataset).
Figure 4.21 shows the results of the real turbulence sequence taken of a building site at a
distance of 5km. An example of a turbulent frame of the sequence is shown in Figure 4.20.
In this sequence there is also fair amount of detail present. The results of the processed
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 61
sequences were similar to the Armscor building sequence with the exception of the
FRTAAS algorithm which showed improved results over the CGI and Time-averaged
methods.
Figure 4.20: Real turbulence degraded frame of building site sequence at a distance of
5km. (CSIR Dataset).
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 62
Figure 4.21: MSE between consecutive frames of Building site sequence.
Figure 4.22 shows the results of a real turbulence sequence taken of a tower at a distance of
11km. An example of a turbulent frame of the sequence is shown in Figure 4.23(a). In this
sequence the detail is minimal. The turbulence level is however severe, both in terms of
geometric distortion and blurring. For comparison, Figure 4.23(b) shows a frame from a
different sequence of the same tower. The sequence was taken from the exact same
location as the blurred sequence but at a time in which the turbulence was negligible.
The CGI and Time-averaged algorithms performed well once again. The FRTAAS
algorithm and the ICA algorithm, while showing improvements over the turbulent
sequence, did not perform as well. The ICA processed sequence still possessed geometric
distortions although they were less than the turbulent sequence.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 63
Figure 4.22: MSE between consecutive frames of Tower sequence.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 64
(a)
(b)
Figure 4.23: (a) Real turbulence-degraded frame of a tower at a distance of 11km and (b)
same tower at 11km but with negligible turbulence. (CSIR Dataset).
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 65
(a)
(b)
Figure 4.24: (a) Frame from CGI algorithm output sequence and (b) frame from FRTAAS
algorithm. (CSIR Dataset).
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 66
(a)
(b)
Figure 4.25: (a) Frame from Time-averaged algorithm output sequence and (b) frame from
ICA algorithm. (CSIR Dataset).
Figure 4.27 shows the results of a real turbulence sequence taken of a shack at a distance of
10km. An example of a turbulent frame of the sequence is shown in Figure 4.26. The CGI
and Time-averaged algorithms performed well once again, with the Time-averaged
algorithm outperforming the CGI algorithm in this case. The ICA processed sequence still
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 67
possessed geometric distortions although they were less than the turbulent sequence. The
FRTAAS algorithm, while stable, did contain warping on certain of the features.
Figure 4.26: Real turbulence-degraded frame of a shack at a distance of 10km.
(CSIR Dataset).
Figure 4.27: MSE between consecutive frames of Shack sequence.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 68
4.3.2 Real turbulence-degraded sequences with motion
Figure 4.28 shows the results of the building site sequence with motion present in the scene
in the form of a car. The results were calculated using the MSE between consecutive
frames. Since there is motion present in the scene, the MSE between frames will be higher.
This will apply to all the output sequences though and the results are therefore still
relevant. The results can be compared with Figure 4.21 which is part of the same sequence,
the only difference being the motion of the car. It can be seen that the FRTAAS and Timeaveraged algorithms broke down in the presence of motion. The ICA algorithm performed
similarly to before but as discussed i.e. while the geometric distortions were reduced the
effect of heat shimmer was still present. The CGI algorithm once again showed a stable
output sequence with improvements over the turbulence sequence.
Figure 4.28: MSE between consecutive frames of Building site sequence with motion.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 69
4.3.3 Sharpness of real turbulence-degraded sequences
The sharpness of the outputs of the algorithms was calculated using Equation (5). As
shown in section 2.2.2.2 the lowest value corresponds to the sharpest image. The results of
using the kurtosis of the image, as described by Li [1], is also shown. Since this was the
only algorithm discussed which explicitly dealt with and described methods of enhancing
the image turbulent images the results of the CGI algorithm (pre-enhancement) are also
shown. Figures 4.29-4.33 show the sharpness of the turbulence shack sequence compared
to the corrected shack sequences. It can be seen that the algorithms did not degrade beyond
the sharpness levels of the turbulence sequences. The ICA algorithm also shows frame 12
being significantly sharper than the other frames and matching the sharpest level obtained
by the kurtosis algorithm. This can also be confirmed visually.
Figure 4.29: Sharpness of frames in Shack sequence using CGI algorithm.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 70
Figure 4.30: Sharpness of frames in Shack sequence using CGI algorithm with kurtosis
enhancement.
Figure 4.31: Sharpness of frames in Shack sequence using Time-averaged algorithm.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 71
Figure 4.32: Sharpness of frames in Shack sequence using ICA algorithm.
Figure 4.33: Sharpness of frames in Shack sequence using FRTAAS algorithm.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 72
Figures 4.34-4.38 shows the sharpness of the turbulent building site sequences compared to
the corrected sequences.
Figure 4.34: Sharpness of frames in Building site sequence using Time-averaged algorithm.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 73
Figure 4.35: Sharpness of frames in Building site sequence using ICA algorithm.
Figure 4.36: Sharpness of frames in Building site sequence using FRTAAS algorithm.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 74
Figure 4.37: Sharpness of frames in Building site sequence using CGI algorithm with Kurtosis
enhancement.
Figure 4.38: Sharpness of frames in Building site sequence using CGI algorithm.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 75
4.4
CONCLUSION
Based on the results above it was shown that the CGI algorithm performed the best when
real motion as well as turbulence motion was present in the scene. It was also shown that
under real turbulence conditions, the CGI performed the best along with the Timeaveraged algorithm. Another reason for selecting the CGI algorithm was the way in which
the compensation for geometric distortions was achieved by using a fixed time window.
This also increased the complexity of the algorithm since the motion vectors would have to
be calculated for each of the frames in the time window but the accuracy was however
increased. Therefore, for real-time simulation, the CGI algorithm [1] was chosen. The
Time-averaged algorithm was also implemented for comparison. OpenCV was used for the
implementation in C as many image processing algorithms and functions are readily
available. All results were obtained on an Intel Core Duo with a CPU speed of 2 GHz and
2 GB of RAM. The Lucas-Kanade algorithm was chosen for both implementations since
this algorithm was available in OpenCV and is optimized. The CGI algorithm [1] was able
to run at a frame rate of 9 frames per second whereas the Time-averaged algorithm ran at a
frame rate of 29 frames per second. The time window chosen for the CGI algorithm was 10
frames i.e. to compensate for each frame in the sequence, the optical flow between 10
frames had to be calculated. When the time window was decreased to 6 frames, a frame
rate of approximately 14 frames per second was achieved. The sizes of the images were
256x256.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 76
CHAPTER 5
CONCLUSION AND FUTURE WORK
5.1
CONCLUSION
Algorithms for the removal of heat scintillation in sequences were researched and a
comparative analysis performed. Four algorithms were selected for the comparative
analysis based on their ability to compensate for geometric distortions as well as
minimising or enhancing images blurred by the effect of atmospheric turbulence. It was
shown that all the algorithms were capable of reducing the geometric distortions present in
the sequences with the FRTAAS [13], CGI [1] and Time-averaged [3, 11, 18] algorithms
outputting sequences that are stable and geometrically improved. It was observed with the
ICA algorithm that while the geometric distortions were reduced, they were not removed
and the effect of heat shimmer still remained. The property of quasi-periodicity, used by
many algorithms to compensate for geometric distortions, was examined and shown using
real-turbulence degraded sequences provided by the CSIR. An algorithm was also
developed to simulate the effects of atmospheric turbulence, allowing us to compare our
results with the ground-truth images, which was not possible with the real-sequences. The
problem of real-motion present in the scene along with the effects of turbulence was
investigated. While most algorithms had difficulty dealing with real-motion in the scene,
the CGI algorithm [1] was shown to compensate for geometric distortions while preserving
real-motion. By estimating the period of turbulence, an adaptive CGI algorithm was
developed capable of providing improved results over using a fixed period. This method
increased the computational complexity of the algorithm making it less suitable for realtime implementation. It was shown that by using the median of the trajectories, a fixed
period could be maintained and an improved output observed especially in the presence of
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 77
real-motion. The sharpness levels of the various outputs from the algorithms were also
investigated and it was shown that none of the algorithms served to further degrade the
sequences. The enhancement of the images using kurtosis was also shown to provide a
significant improvement in the sharpness of the images. Comparative analysis was
performed on both real and simulated turbulence sequences and it was seen that while the
FRTAAS algorithm performed better than the others in the simulated sequences, the results
based on the real sequences showed the CGI algorithm to have the best overall
performance. Based on the results of the comparative analysis the CGI algorithm [1] was
chosen and simulated using OpenCV. While a frame rate of only 9 frames per second was
achieved using a time window of ten frames, the algorithm is well suited for parallel
processing which should significantly increase the frame rate.
5.2
FUTURE WORK
While fusion has been used for blurring, methods are also available for fusing images in
which there is a slight amount of misregistation present as well as blurring. Algorithms
such as the MAP (Maximum A Posteriori Probability) algorithm which use special blind
deconvolution methods that are capable of identifying and compensating for the betweenchannel misregistration [23]. Work in this area might allow for the development of a single
algorithm capable of compensating for the blur and distortion simultaneously. Future work
will also include selecting and parallelising an algorithm to function on a GPU or other
hardware capable of handling parallel applications in order to achieve higher frame rates.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 78
BIBLIOGRAPHY
[1] D. Li, R. M. Mersereau, D. H. Frakes and M. J. T. Smith, “A New Method For
Suppressing Optical Turbulence In Video,” in Proc. European Signal Processing
Conference (EUSIPCO’2005), 2005.
[2] B. D. Lucas and T. Kanade, “An iterative image registration technique with an
application to stereo vision (darpa)," in Proc. of the 1981 DARPA Image
Understanding Workshop, pp. 121-130, April 1981.
[3] D. Fraser, G. Thorpe, and A. Lambert, "Atmospheric turbulence visualization with
wide-area motion blur restoration," Optical Society of America, pp. 1751-1758, 1999.
[4] S. Periaswamy and H. Farid, "Differential elastic image registration," Dartmouth
College, Computer Science, Tech. Rep. TR2001-413, 2001.
[5] S. Periaswamy, H. Farid, “Elastic Registration in the presence of Intensity Variations,”
in IEEE transactions on Medical Imaging, vol. 22, pp.865-874, 2003.
[6] S. Periaswamy, H. Farid, “Differential Affine Motion Estimation for Medical Image
Registration,” in proc of SPIE’s 45th Annual Meeting, 2000.
[7] S. Periaswamy, “General-Purpose Medical Image Registration,” Ph.D. thesis,
Computer Science, Dartmouth College, April 2003.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 79
[8] J. V. Stone, Independent Component Analysis: A Tutorial Introduction, MIT Press,
2004.
[9] J.F. Cardoso, A. Souloumiac, “An efficient technique for blind separation of complex
sources,” in Proc. IEEE SP Workshop on Higher-Order Stat, pp. 275-279, 1993.
[10] I. Kopriva, Q. Du, H. Szu and W. Wasylkiwskyj, “Independent Component Analysis
approach to image sharpening in the presence of atmospheric turbulence,” Optics
Communications, Elsevier B. V., vol. 233, pp. 7-14, 2004.
[11] D. H. Frakes, J. W. Monaco, M. J. T. Smith, “Suppression of atmospheric turbulence
in video using an adaptive control grid interpolation,” in Proc. of the IEEE Int. Conf.
Acoustics, Speech, and Signal Processing, pp. 1881-1884, 2001.
[12] D. Li, “Restoration of atmospheric turbulence degraded video using kurtosis
minimization and motion compensation,” Ph.D. thesis, School of Electrical and
Computer Engineering, Georgia Institute of Technology, May 2007.
[13] M. Tahtali, D. Fraser, A. J. Lambert, “Restoration of non-uniformly warped images
using a typical frame as prototype,” in TENCON 2005-2005 IEEE Region 10, pp.
1382-1387, 2005.
[14] G. Wolberg, Digital Image Warping, Los Alamitos, CA, USA: IEEE Computer
Society Press, 1994.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 80
[15] M. C. Roggemann and B. Welsh, Imaging Through Turbulence. CRC Press, 1996.
[16] G. J. Sullivan and R. L. Baker, “Motion compensation for video compression using
control grid interpolation,” in Proc. ICASSP 1991, pp. 2713–2716, 1991.
[17] E. Trucco and A. Verri, Introductory Techniques for 3-D Computer Vision, Prentice
Hall, 1998.
[18] W. Zhao, L. Bogoni and M. Hansen, “Video Enhancement by Scintillation Removal,”
in Proc. of the 2001 IEEE International Conference on Multimedia and Expo, pp. 393396, 2001.
[19] W. A. Clarke, “An Overview of Techniques for the Removal of Atmospheric
Turbulence Effects from Images,” Council for Scientific and Industrial Research
internal document, 2006.
[20] B. R. Frieden, “An exact, linear solution to the problem of imaging through
turbulence,” Optics Communication, Elsevier Science B. V., vol. 150, pp. 15-28, 1998.
[21] J. F. Cardoso, “Blind Beamforming for Non Gaussian Signals,” IEEE Proc. F, vol.
140, pp. 362-370, 1993.
[22] J. F. Cardoso., “Blind Signal Separation: Statistical Principles,” in Proc. of the IEEE,
vol. 9, no 10, pp. 2009-2025, 1998.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 81
[23] R. S. Blum and Z. Liu., Multi-Sensor Image Fusion and Its Applications, Boca Raton,
CRC Press, 2006.
[24] P. Campisi and K. Egiazarian., Blind Image Deconvolution, Boca Raton, CRC Press,
2007.
[25] K. T. Knox and B. J. Thompson., “Recovery of images from atmospherically
degraded short-exposure photographs,” Astrophysics Journal, vol. 193, pp. L45-L48,
1974.
[26] A. Labeyrie., “Attainment of Diffraction Limited Resolution in Large Telescopes by
Fourier Analyzing Speckle Patterns in Star Images,” Astronomy and Astrophysics,
vol. 6, pp. 85, 1970.
[27] J. F. Cardoso, “Statistical Principles of Source Separation,” in Proc. of the SYSID’97,
11th IFAC symposium on system identification, pp. 1837-1844, 1997.
[28] J. F. Cardoso, “Higher Order Contrasts for ICA,” in Neural Computation, vol. 11, pp.
157-192, 1999.
[29] B. K .P. Horn and B. G. Schunck, “Determining Optical Flow,” Artificial
Intelligence, vol. 17, pp. 185-203, 1981.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 82
[30] D. Fraser, A. Lambert, M. R. S. Jahromi, M. Tahtali and D. Clyde, “Anisoplanatic
Image Restoration at ADFA,” in Proc. VIIth Digital Image Computing: Techniques
and Applications, pp. 19-28, 2003.
[31] G. Thorpe, A. Lambert and D. Fraser, "Atmospheric turbulence visualization through
Image Time-Sequence Registration," in Proc. of the International Conference on
Pattern Recognition, vol. 2, pp. 1768-1770, 1998.
[32] L. P. Yaroslavsky, B. Fishbain, A. Shteinman and S. Gepshtein, “Processing and
Fusion of Thermal and Video Sequences for Terrestrial Long Range Observation
Systems,” in Proceedings of the 7th International Conference on Information Fusion
(FUSION '04), vol. 2, pp. 848–855, Stockholm, Sweden, 2004.
[33] B. Zitova and J. Flusser, “Image Registration Methods: a Survey,” Image and Vision
Computing, vol. 21, pp. 977-1000, 2003.
[34] D. Li, R. M. Mersereau and S. Simske, “Blur Identification Based on Kurtosis
Minimization,” in Proc. of the IEEE Int. Conference Image Processing, vol. 1, pp.
905-908, 2005.
[35] S. John and M. A. Vorontsov, “Multiframe Selective Information Fusion from Robust
Error Estimation Theory,” IEEE transactions on Image Processing, vol. 14, pp. 577584, 2005.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 83
[36] C. Bondeau and E. Bourennane, “Restoration of Images Degraded by the
Atmospheric Turbulence,” in Proc. of ICSP, pp. 1056-1059, 1998.
[37] M. A. Vorontsov and G. W. Carhart, “Anisoplanatic Imaging Through Turbulent
Media: Image Recovery by Local Information Fusion from a Set of Short-Exposure
Images,” in Journal of Opt. Soc. of America, vol. 18, No. 6, pp. 1312-1324, 2001.
[38] D. G. Sheppard, B. R. Hunt and M. W. Marcellin, “Iterative MultiFrame SuperResolution Algorithms for Atmospheric Turbulence-Degraded Imagery,” in Proc. of
the IEEE International Conference on Acoustics, Speech and Signal Processing, pp.
2857-2860, 1998.
[39] D. G. Sheppard, B. R. Hunt and M. W. Marcellin, “Super-Resolution of Imagery
Acquired through Turbulent Atmosphere,” Conference Record of the Thirtieth
Asilomar Conference on Signals, Systems and Computers, pp. 81-85, 1997.
[40] L. Peng and X. Peng, “Turbulent Effort Imaging and Analysis,” in Proc. of the IEEE,
Circuits and Systems, pp. 588-591, 1998.
[41] B. Galvin, B. McCane, K. Novins, D. Mason and S. Mills, “Recovering Motion
Fields: An Evaluation of Eight Optical Flow Algorithms,” in Proc. of the Ninth British
Machine Vision Conference, pp. 195-204, 1998.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 84
[42] J. L. Barron, D. Fleet, S. S. Beauchemin, and T. Burkitt, “Performance of Optical
Flow Techniques,” in Proc. of the IEEE on Computer Vision and Pattern Recognition,
pp. 236–242, 1992.
[43] S. S. Beauchemin and J. L. Barron, “The Computation of Optical Flow,” ACM
Computing Surveys, vol. 27, pp. 433-467, 1995.
[44] R. C. Gonzalez and R. E. Woods, Digital Image Processing 2/E, Prentice Hall, 2002.
[45] PETS 2000 Dataset. []
Available from: http://www.cvg.rdg.ac.uk/slides/pets.html
[Accessed: 24/10/2007]
[46] The USC-SIPI Image Database.
Available form: http://sipi.usc.edu/database/
[Accessed: 24/10/2007]
[47] M. Holloway, Interview, CSIR, 2008.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 85
APPENDIX A
FRTAAS MATLAB CODE
% Runs the FRTAAS algorithm using the
% elastic image registration algorithm
clear,close all,clc;
% Read in clip and initialise
tic;
init;
mov=aviread('armscor',1:120);
N=28; % frame length
% determine sharpest frame in sequence
sh=0;
for k=1:N
i1=mov(k).cdata;
i1=im2double(i1);
for x=1:size(i1,1)
for y=1:size(i1,2)
temp=i1(x,y);
if temp~=0
shtemp=-((log(temp)/log(exp(1)))*temp);
sh=sh+shtemp;
end
end
end
shf(k)=sh;
sh=0;
end
[c,i]=min(shf)
clear i1 sh shtemp shf c k x y temp
% Begin algorithm
%i1=rgb2gray(mov(1).cdata);
i1=(mov(i).cdata);
i1 = im2double(i1);
for k=2:N
k
%
i2=rgb2gray(mov(k).cdata);
i2=(mov(k).cdata);
i2 = im2double(i2);
[i1_warped,flow]=register2d(i1,i2);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 86
u(:,:,k-1)=-flow.m5;
v(:,:,k-1)=flow.m6;
end
cx=(sum(u,3))./N;
cy=(sum(v,3))./N;
for k=2:N
temp=mov(k).cdata;
temp=im2double(temp);
final(:,:,k-1)=mdewarpfinal(temp,-(u(:,:,k-1)-cx),-(v(:,:,k-1)-cy));
end
for k=2:N
map=gray(256);
mov1(k-1) = im2frame(final(:,:,k-1)*255,map);
end
map=gray(256);
for k=1:N-1
temp1=(mat2gray(mov1(k).cdata));
mov1(k)=im2frame(im2uint8(temp1),map);
temp2=(mat2gray(mov(k).cdata));
mov(k)=im2frame(im2uint8(temp2),map);
%mov(k)=mat2gray(mov(k).cdata);
end
mplay(mov);
mplay(mov1);
toc;
%x=mdewarpfinal(i1,u(:,:,1),v(:,:,1));
outvid='armscorout_1to120_frtaas';
%movie2avi(mov1,outvid,'fps',20,'compression','None');
save(outvid,'mov1');
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 87
%
% function [i1_warped,flowAcc] = register2d(i1_in,i2_in,params)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [i1_warped,flowAcc] = register2d(i1_in,i2_in,params)
% First set default parameters
if (~exist('params'))
params = params_default;
end
[h,w]
= size(i1_in);
if (~isfield(params.glob,'numLevels')) % Newly added field
params.glob.numLevels
= 100;
end
i1
i2
[h,w]
= i1_in;
= i2_in;
= size(i1);
%--------------- Padding begin ----------------------------newH = nextpow2(h);
newW = nextpow2(w);
padHl = floor((newH-h) / 2);
padHr = newH-h - padHl;
padWl = floor((newW-w) / 2);
padWr = newW-w - padWl;
mind
= min(w,h);
levels = floor(log2(mind/params.main.minSize)+1);
padWl
padHl
padWr
padHr
=
=
=
=
padWl
padHl
padWr
padHr
+
+
+
+
(params.main.padSize
(params.main.padSize
(params.main.padSize
(params.main.padSize
*
*
*
*
2^levels);
2^levels);
2^levels);
2^levels);
padW = padWl + padWr;
padH = padHl + padHr;
i1 = pad2dlr(i1,padWl,padWr,padHl,padHr,0);
i2 = pad2dlr(i2,padWl,padWr,padHl,padHr,0);
%--------------- Padding end ----------------------------pyr1(1).im
pyr2(1).im
= i1;
= i2;
[ht,wt] = size(pyr1(1).im);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 88
%--------------- Construct pyramid ---------------------fprintf('Pyramid level: %g size: %gx%g mse is: %g\n',...
1,ht,wt,mse(pyr1(1).im,pyr2(1).im ));
for i = 2:levels
pyr1(i).im = reduce(pyr1(i-1).im);
pyr2(i).im = reduce(pyr2(i-1).im);
[ht,wt] = size(pyr1(i).im);
fprintf('Pyramid level: %g size: %gx%g mse is: %g\n',...
i,ht,wt,mse(pyr1(i).im,pyr2(i).im ));
end
fprintf('-----\n');
%--------------- End construct pyramid ------------------
[hs,ws] = size(pyr1(levels).im);
flowAcc = flow_init(ws,hs);
i1_w = pyr1(levels).im;
for i=levels:-1:1 % (from coarse to fine)
fprintf('Pyramid level: %g h: %g w: %g mse is: %g\n',...
i,size(pyr1(i).im),mse(pyr1(i).im,pyr2(i).im ));
if (params.glob.flag)
fprintf('Finding global affine fit\n');
[flow_glob,M] = aff_find_flow(i1_w,pyr2(i).im, ...
params.glob.model,params.glob.iters);
flowAcc
= flow_add(flowAcc,flow_glob);
flowAcc.m7 = flow_glob.m7;
flowAcc.m8 = flow_glob.m8;
fprintf('Done\n');
end
% Notes:
%
%
flowfind_smooth warps the image by flowAcc
%
before it finds the flow field.
%
This takes care of the global warp.
%
It also accumulates the previous flowAcc.
%
%
The flow accumulation is also done in flowfind_smooth
%
since it is this function that displays intermediate
%
results.
if (params.glob.numLevels >= levels-i+1) % in case we need to
stop at a particular level
flowAcc = flowfind_smooth(pyr1(i).im,pyr2(i).im,params,...
flowAcc,i,levels);
end
if (i ~= 1) %for all but the finest scale
%prepare for the next scale
flowAcc = flow_reduce(flowAcc,-1);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 89
if (params.glob.flag)
i1_w
= flow_warp(pyr1(i-1).im,flowAcc);
end
end
end
%undo padding
flowAcc
= flow_undopad(flowAcc,padWl,padWr,padHl,padHr);
%warp image in the finest scale
i1_warped = flow_warp(i1_in,flowAcc);
fprintf('Pyramid level: %g mse is: %g\n',...
1,mse(i1_warped,i2_in));
ftime = clock;
return;
function [flow_glob,M] = aff_find_flow(i1,i2,model,iters)
[h,w]
[M,b,c]
flow_glob
flow_glob.m7
flow_glob.m8
M
=
=
=
=
=
size(i1);
affbc_iter(i1,i2,iters,model);
flow_aff(M,w,h);
ones(h,w) .* c;
ones(h,w) .* b;
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 90
%
% function [params] = params_default
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [params] = params_default
params.main.boxW
params.main.boxH
params.main.model
params.main.minSize
params.main.dispFlag
params.main.padSize
params.smooth.loops_inner
params.smooth.loops_outer
params.smooth.lamda
1e11];
params.smooth.deviant
params.smooth.dweight
params.glob.flag
params.glob.model
params.glob.iters
params.glob.numLevels
=
=
=
=
=
=
5;
5;
4;
128;
0;
2;
= 1;
= 1;
= [1e11 1e11 1e11 1e11 1e11 1e11 1e11
= [0 0 0 0 0 0 1 0];
= [0 0 0 0 0 0 0 0];
=
=
=
=
1;
4;
2;%20;
100;
return;
%
Explanation of parameters
%
%
params.main.boxW
= width of box used in least squares
estimate
%
params.main.boxH
= height of box used in least squares
estimate
%
params.main.model
= model used in estimation
%
%
4 -> affine + translations + contrast/brightness
%
3 -> affine + translation
%
2 -> translation + contrast/brightness
%
1 -> translation
%
%
params.main.minSize
= lowest scale of pyramid has this size
%
params.main.dispFlag
= display intermediate results
%
params.main.padSize
= padding at coarsest scale
%
%
params.smooth.loops_inner = Smoothness iterations
%
params.smooth.loops_outer = Taylor series iterations
%
params.smooth.lamda
= Lamda values on smoothness terms
%
%
params.smooth.deviant
= internal, ignore
%
params.smooth.dweight
= internal, ignore
%
%
params.glob.flag
= perform global registration also
%
params.glob.model
= model of global registration,
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 91
%
%
%
%
params.glob.iters
params.glob.numLevels
similar to local model.
= iterations used in global estimation
= internal, ignore
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 92
%
% function v = nextpow2(v)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function v = nextpow2(v)
l = log2(v);
if (l == floor(l))
return;
end
v = 2^round(log2(v)+0.5);
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 93
%
% function out = pad(img,bx,by,val)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function out = pad(img,bx,by,val)
if (nargin == 3)
val = 0;
end
[h,w] = size(img);
out
= ones(h+2*by,w+2*bx) .* val;
out(by+1:by+h,bx+1:bx+w) = img;
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 94
%
% function imgOut = pad2dlr(imgIn,padWl,padWr,padHl,padHr,val,undoFlag)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function imgOut = pad2dlr(imgIn,padWl,padWr,padHl,padHr,val,undoFlag)
if (~exist('val','var'))
val = 0;
end
if (~exist('undoFlag','var'))
undoFlag = 0;
end
[h,w] = size(imgIn);
if (undoFlag == 0)
imgOut= ones(h+padHl+padHr,w+padWl+padWr) .* val;
imgOut(padHl+1:padHl+h,padWl+1:padWl+w) = imgIn;
else
h = h - padHl - padHr;
w = w - padWl - padWr;
imgOut = imgIn(padHl+1:padHl+h,padWl+1:padWl+w);
end
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 95
%
% function out = reduce(in, cnt)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
%
%USAGE: out = reduce(in, cnt);
%
%
This function blurrs img
%
with the seperable filter
%
[.05 .25 .4 .25 .05]
%
and then subsamples.
%
Process repeated cnt times.
function img = reduce(img,cnt)
[h,w] = size(img);
filt = [.05 .25 .4 .25 .05];
if (nargin == 1)
cnt = 1;
end
if (cnt == 0)
return;
end
for i = 1:cnt
img = conv2mirr(img,filt,filt);
img = img([1:2:h],[1:2:w]);
h = h/2;
w = w/2;
end
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 96
%
% function out = resize_2d(in,w,h)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function out = resize_2d(in,w,h)
[oh,ow] = size(in);
[mx,my] = meshgrid(linspace(1,oh,h), linspace(1,ow,w));
out
= interp2(in,mx,my,'cubic');
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 97
%
% function updatedisplay(i1,i2,flowA,i1_warped,curIter,maxIter,level);
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function updatedisplay(i1,i2,flowA,i1_warped,curIter,maxIter,level);
figure(1);
[h,w] = size(i1);
fprintf('Displaying...');
set(gcf,'DoubleBuffer','on');
set(gca,'NextPlot','replace','Visible','off')
set(gcf,'renderer','zbuffer');
grid
= grid2d(w,h,floor(16*h/256),1);
grid_warped = flow_warp(grid,flowA);
i1_warped_bc = i1_warped .* flowA.m7 + flowA.m8;
imgC = trunc(flowA.m7,0,1);
imgB = trunc(flowA.m8,0,1);
row1 = rowimg(i1,i2,abs(i1-i2));
row2 = rowimg(i1_warped,i1_warped_bc,abs(i1_warped_bc-i2));
row3 = rowimg(flowA.m7, flowA.m8,1-grid_warped);
myimg = [row1;row2;row3];
myimg = frameimg(myimg,1,0);
imagesc(myimg,[0 1]);
colormap(gray);
axis image;
%truesize;
axis off;
x = 2;
y = h*2+15;
dy = 20;
tstr = sprintf('%s [%d x %d] level: %d iter: %d/%d',...
datestr(now),w,h,level,curIter,maxIter);
title({tstr},'HorizontalAlignment','left','fontname','courier','position'
,[0 0],'Interpreter','none','FontSize',8);
%set(gca,'position',[0 0 1 0.9]);
drawnow;
fprintf('Done!\n');
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 98
return;
function out = rowimg(varargin)
out = varargin{1};
out = frameimg(out,1,1);
for i=2:nargin
img = varargin{i};
img = frameimg(img,1,1);
out = [out img];
end
return;
function out=trunc(in,minv,maxv)
out
ind
out(ind)
ind
out(ind)
=
=
=
=
=
in;
find(out > maxv);
1;
find(out < 0);
0;
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 99
%
% function pat = grid(w,h,t,v)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function pat = grid(w,h,t,v)
pat = zeros(h,w);
pat(1:t:h,1:w) = v;
pat(1:h,1:t:w) = v;
pat(h,1:w)
pat(1:h,w)
= v;
= v;
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 100
% Compile c code and initialize paths
if (exist('c_diffxyt') ~= 3)
fprintf('Compiling c/c_diffxyt.c\n');
cd c
mex c_diffxyt.c
cd ..
end
if (exist('c_smoothavg') ~= 3)
fprintf('Compiling c/c_smoothavg.c\n');
cd c
mex c_smoothavg.c
cd ..
end
addpath('.:./c:./register:./utils:');
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 101
%
% function [mx,my] = meshgridimg(w,h)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [mx,my] = meshgridimg(w,h)
[mx,my]
= meshgrid([0:w-1]-w/2+0.5,-([0:h-1]-h/2+0.5));
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 102
%
% function out = mirror_extend(in,bx,by)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function out = mirror_extend(in,bx,by)
%Note: works for both even and odd bx/by!
[h,w] = size(in);
%First flip up and down
u = flipud(in([2:1+by],:));
d = flipud(in([h-by:h-1],:));
in2 = [u' in' d']';
%Next flip left and right
l = fliplr(in2(:, [2:1+bx]));
r = fliplr(in2(:,[w-bx:w-1]));
%set the 'mirrored' image to out.
out = [l in2 r];
return;
%test
A = [1 2 3 4;5 6 7 8;9 10 11 12]
B = mirror_extend(A,2,2)
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 103
%
% function err=mse(i1,i2,b)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function err=mse(i1,i2,b)
if (nargin == 3)
[h,w] = size(i1);
nh = h - 2*b;
nw = w - 2*b;
i1 = cutc(i1,nw,nh);
i2 = cutc(i2,nw,nh);
end
i1 = i1(:);
i2 = i2(:);
d
d
= (i1 - i2);
= d.*d;
err = sqrt(mean(d));
return
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 104
%
% function flow = flow_reduce(flow,scale)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function flow =
scale
flow.m5
flow.m6
flow_reduce(flow,scale)
= -scale;
= scaleby2(flow.m5,scale) .* (2^scale);
= scaleby2(flow.m6,scale) .* (2^scale);
if (isfield(flow,'m7'))
flow.m7 = scaleby2(flow.m7,scale);
flow.m8 = scaleby2(flow.m8,scale);
end
return;
function out = scaleby2(in,scale)
if (scale == 0)
out = in;
return;
end
[h,w]
= size(in);
scale = 2^scale;
[mx,my] = meshgrid(linspace(1,w,scale*w),linspace(1,h,scale*h));
out
= interp2(in,mx,my,'linear');
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 105
%
% function flow=flow_smooth(flow,params)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function flow=flow_smooth(flow,params)
persistent index rankE PR KR h w blurr r_blurr sfile iFlag m_avg
model;
global lamda deviant dweight sfilt
if (isempty(PR))
fprintf('Smoothness: Initializing\n');
lamda =
deviant
dweight
model
params.smooth.lamda;
= params.smooth.deviant;
= params.smooth.dweight;
= params.main.model;
affbc_find_init;
[h,w]
= size(flow.m1);
if (h < 64 | w < 64)
fprintf('flow_smooth: Size < 64 , setting model=2\n');
model= 2;
end
[L,d,index,rankE,iFlag] =
smooth_setC(lamda,deviant,dweight,model);
[M,b,c,r,pt,kt]
= affbc_find_api(flow.f,flow.g,model);
PR = zeros(h*w,8,8);
KR = zeros(h*w,8);
r
ir
= [1:rankE];
= index(r);
area = h*w;
for i=1:area
p = pt(:,i);
P = p * p';
K = p * kt(i);
C = K +d;
R = inv(P+L);
if (iFlag)
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 106
PR(i,ir,ir) = R(r,r);
KR(i,ir)
= C(r)';
else
PR(i,:,:) = R(:,:);
KR(i,:)
= C(:)';
end
end
m_avg
sfilt
= zeros(8,h*w);
= [1 4 1;4 0 4;1 4 1];
for i=1:8
blurr(i).filt = sfilt .* lamda(i);
end
fprintf('Smoothness: Initializing complete\n');
end
%r_blurr
= conv2mirr(flow.r,sfilt);
r_blurr
= c_smoothavg(flow.r,1);
r_zind
= find(r_blurr == 0);
r_blurr(r_zind) = 1;
flow.r
flow.r(r_zind)
%m_avg(1,:)
r_blurr,1,h*w);
%m_avg(2,:)
r_blurr,1,h*w);
%m_avg(3,:)
r_blurr,1,h*w);
%m_avg(4,:)
r_blurr,1,h*w);
%m_avg(5,:)
r_blurr,1,h*w);
%m_avg(6,:)
r_blurr,1,h*w);
%m_avg(7,:)
%m_avg(8,:)
m_avg(1,:) =
r_blurr,1,h*w);
m_avg(2,:) =
r_blurr,1,h*w);
m_avg(3,:) =
r_blurr,1,h*w);
m_avg(4,:) =
r_blurr,1,h*w);
m_avg(5,:) =
r_blurr,1,h*w);
m_avg(6,:) =
r_blurr,1,h*w);
m_avg(7,:) =
m_avg(8,:) =
= ones(h,w);
= 0;
= reshape(conv2mirr(flow.m1,blurr(1).filt) ./
= reshape(conv2mirr(flow.m2,blurr(2).filt) ./
= reshape(conv2mirr(flow.m3,blurr(3).filt) ./
= reshape(conv2mirr(flow.m4,blurr(4).filt) ./
= reshape(conv2mirr(flow.m5,blurr(5).filt) ./
= reshape(conv2mirr(flow.m6,blurr(6).filt) ./
= reshape(conv2mirr(flow.m7,blurr(7).filt/20),1,h*w);
= reshape(conv2mirr(flow.m8,blurr(8).filt/20),1,h*w);
reshape(c_smoothavg(flow.m1 , lamda(1)) ./
reshape(c_smoothavg(flow.m2 , lamda(2)) ./
reshape(c_smoothavg(flow.m3 , lamda(3)) ./
reshape(c_smoothavg(flow.m4 , lamda(4)) ./
reshape(c_smoothavg(flow.m5 , lamda(5)) ./
reshape(c_smoothavg(flow.m6 , lamda(6)) ./
reshape(c_smoothavg(flow.m7, lamda(7)/20),1,h*w) ;
reshape(c_smoothavg(flow.m8, lamda(8)/20),1,h*w) ;
KRA = KR + m_avg';
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 107
m = zeros(h*w,8);
for r = 1:8
m(:,r) = sum( squeeze(PR(:,r,:)) .* KRA,2);
end
flow.m1(:)
flow.m2(:)
flow.m3(:)
flow.m4(:)
flow.m5(:)
flow.m6(:)
flow.m7(:)
flow.m8(:)
=
=
=
=
=
=
=
=
m(:,1);
m(:,2);
m(:,3);
m(:,4);
m(:,5);
m(:,6);
m(:,7);
m(:,8);
flow.m1(r_zind)
flow.m2(r_zind)
flow.m3(r_zind)
flow.m4(r_zind)
flow.m5(r_zind)
flow.m6(r_zind)
flow.m7(r_zind)
flow.m8(r_zind)
=
=
=
=
=
=
=
=
1;
0;
0;
1;
0;
0;
1;
0;
return;
function [L,d,index,rankE,iFlag] =
smooth_setC(lamda,deviant,dweight,model)
[index,afFlag,bcFlag] = getindex(model);
iFlag
= ~(afFlag & bcFlag);
rankE = length(index);
L = zeros(rankE,rankE);
for i = 1:rankE
ind
= index(i);
L(i,i) = lamda(ind) + dweight(ind);
d(i)
= deviant(ind) .* dweight(ind);
end
d = d';
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 108
%
% function flowA =
flowfind_smooth(i1,i2,params,flowA,currLevel,totLevels)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
%
%
%
%
%
%
Note:
The unwarped i1 is passed in as a parameter since all
subsequent warpings are performed using the accumulated
flow on the original image.
function flowA = flowfind_smooth(i1,i2,params,flowA,currLevel,totLevels)
[h,w] = size(i1);
if (~exist('flowA'))
flowA = flow_init(w,h);
i1_warped = i1;
else
i1_warped = flow_warp(i1,flowA);
end
flow
= flowA;
flow.m7 = ones(h,w);
flow.m8 = zeros(h,w);
dispFlag
= params.main.dispFlag;
loops_outer = params.smooth.loops_outer;
loops_inner = params.smooth.loops_inner;
if (dispFlag)
hw
= waitbar(0,'Finding Smooth Flow');
updatedisplay(i1,i2,flowA,i1_warped,0, loops_outer,currLevel);
end
for j=1:loops_outer
fprintf('Outer iteration: %d/%d\n',j,loops_outer);
flow = flowfind_raw(i1_warped,i2,params);
clear flow_smooth;
for i=1:loops_inner
fprintf('Level: %d/%d Iteration outer: %d/%d inner: %d/%d
size: %dx%d\n', totLevelscurrLevel+1,totLevels,j,loops_outer,i,loops_inner,w,h);
if (dispFlag)
waitbar(i/loops_inner*j/loops_outer,hw);
end
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 109
flow = flow_smooth(flow,params);
end
[flowA,i1_warped] = flow_add(flowA,flow,i1);
flowA.m7 = flow.m7;
flowA.m8 = flow.m8;
if (dispFlag)
waitbar(i/loops_inner*j/loops_outer,hw,...
sprintf('iteration %g/%g' ,j,loops_outer));
updatedisplay(i1,i2,flowA,i1_warped,j,
loops_outer,currLevel);
end
end
%keyboard;
if (dispFlag)
close(hw);
end
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 110
%
% function flowOut = flow_undopad(flowIn,padWl,padWr,padHl,padHr)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function flowOut = flow_undopad(flowIn,padWl,padWr,padHl,padHr)
flowOut.m5 = pad2dlr(flowIn.m5,padWl,padWr,padHl,padHr,0,1);
flowOut.m6 = pad2dlr(flowIn.m6,padWl,padWr,padHl,padHr,0,1);
if (isfield(flowIn,'m7'))
flowOut.m7 = pad2dlr(flowIn.m7,padWl,padWr,padHl,padHr,0,1);
flowOut.m8 = pad2dlr(flowIn.m8,padWl,padWr,padHl,padHr,0,1);
end
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 111
%
% function [out] = flow_warp(in,flow,mtd,eflag)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [out] = flow_warp(in,flow,mtd,eflag)
if (nargin == 2)
mtd = 'cubic';
end
if (nargin < 4)
eflag = 0;
end
[h,w]
b
= size(in);
= floor(h/4);
if (eflag)
in
else
in
end
= mirror_extend(in,b,b);
= pad(in,b,b);
flow.m5 = mirror_extend(flow.m5,b,b);
flow.m6 = mirror_extend(flow.m6,b,b);
[h,w]
= size(in);
[mx,my] = meshgridimg(w,h);
mx2
my2
= mx + flow.m5;
= my + flow.m6;
out
= interp2(mx,my,in,mx2,my2,mtd);
out
= out(b+1:h-b,b+1:w-b);
out(find(isnan(out))) = 0;
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 112
%
% function [out]=flowfind_raw(im1,im2,params);
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [out]=flowfind_raw(im1,im2,params);
if (~exist('params','var'))
params = params_default;
end
barFlag = 0;
t0
= clock;
%%%%%%%%%%%%% Parameters for aff_find
frameSize = 0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[h_org,w_org] = size(im1);
%if (h_org == 32)
%
boxW = 3;
%
boxH = 3;
%
model= 2;
%
fprintf('flowfind_raw: Size: 32x32, setting model=2, box=4\n');
%end
boxW
boxH
model
boxW2
boxH2
im1 =
im2 =
= params.main.boxW;
= params.main.boxH;
= params.main.model;
= floor(boxW/2);
= floor(boxH/2);
mirror_extend(im1,boxW,boxH);
mirror_extend(im2,boxW,boxH);
[h,w] = size(im1);
pcOrg = 0;
if (barFlag)
hw = waitbar(0,'Estimating flow...');
end
[fx,fy,ft]
= diffxyt(im1,im2,[3 3]);
[index,afFlag,bcFlag] = getindex(model);
clear affbc_find;
global affbc_params;
affbc_params.model
= model;
affbc_params.index
= index;
affbc_params.frameSize = frameSize;
affbc_params.w = boxW;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 113
affbc_params.h = boxH;
affbc_params.afFlag = afFlag;
affbc_params.bcFlag = bcFlag;
q
q(1,:,:)
q(2,:,:)
q(3,:,:)
q(4,:,:)
=
=
=
=
=
zeros(5,h,w);
-im1;
fx;
fy;
ft;
mout = zeros(h,w,9);
for y=boxH2+1:h-boxH2
if (barFlag)
pc = (y-boxH2-1)/(h-boxH);
waitbar(pc,hw);
end
y1=y -boxH2;
y2=y1+boxH -1;
yind = y1:y2;
for x=boxW2+1:w-boxW2
x1=x -boxW2;
x2=x1+boxW -1;
xind = x1:x2;
chunk
affbc_params.nf
affbc_params.fx
affbc_params.fy
affbc_params.ft
=
=
=
=
=
q(:,yind,xind);
chunk(1,:);
chunk(2,:);
chunk(3,:);
chunk(4,:);
affbc_find;
mout(y,x,:) = affbc_params.mout;
end
end
out.m1 =
out.m2 =
out.m3 =
out.m4 =
out.m5 =
out.m6 =
out.m7 =
out.m8 =
out.r =
mout(:,:,1);
mout(:,:,2);
mout(:,:,3);
mout(:,:,4);
mout(:,:,5);
mout(:,:,6);
mout(:,:,7);
mout(:,:,8);
mout(:,:,9);
if (1)
maxd
= boxW/2;
ind
= find(abs(out.m5) >= maxd | abs(out.m6) >= maxd);
out.m1(ind) = 0;
out.m2(ind) = 0;
out.m3(ind) = 0;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 114
out.m4(ind) = 0;
out.m5(ind) = 0;
out.m6(ind) = 0;
out.m7(ind) = 1;
out.m8(ind) = 0;
out.r(ind) = 0;
cnt
= length(ind);
fprintf('out of bounds: %.2f%%\n',cnt/h/w*100);
end
out.fx = fx;
out.fy = fy;
out.ft = ft;
out.f = im1;
out.g = im2;
out.model = model;
out.index = index;
out = flow_extract(out,h_org,w_org);
%waitbar(1,hw);
if (barFlag)
close(hw);
end
t0=etime(clock,t0);
fprintf('Elapsed time: %g\n',t0);
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 115
%
% function [index,affFlag,bcFlag] = getindex(model)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [index,affFlag,bcFlag] = getindex(model)
affFlag = 0;
bcFlag = 0;
switch model
case 1; % Translation
index = [5 6];
case 2; % Translation + BC
index=[5 6 7 8];
bcFlag = 1;
case 3; % Affine+Translation
index=[1 2 3 4 5 6];
affFlag = 1;
case 4; % Affine+Translation + BC
index=[1 2 3 4 5 6 7 8];
affFlag = 1;
bcFlag = 1;
end
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 116
%
% function [out] = frameimg(in,b,val)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [out] = frameimg(in,b,val)
[h,w] = size(in);
H1
= framegen(h,w,b);
H2
= 1-H1;
out = in .* H1 + H2 .* val;
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 117
%
% function [H] = framegen(h,w,frameSize)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [H] = framegen(h,w,frameSize)
H = zeros(h,w);
H(frameSize+1:h-frameSize,frameSize+1:w-frameSize) = 1;
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 118
%
% function flow_out = flow_padlr(flow,padWl,padWr,padHl,padHr)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function flow_out = flow_padlr(flow,padWl,padWr,padHl,padHr)
flow_out.m5
flow_out.m6
flow_out.m7
flow_out.m8
=
=
=
=
pad2dlr(flow.m5,padWl,padWr,padHl,padHr,0);
pad2dlr(flow.m6,padWl,padWr,padHl,padHr,0);
pad2dlr(flow.m7,padWl,padWr,padHl,padHr,1);
pad2dlr(flow.m8,padWl,padWr,padHl,padHr,0);
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 119
%
% function flow = flow_init(w,h)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function flow = flow_init(w,h)
flow.m5
flow.m6
flow.m7
flow.m8
= zeros(h,w);
= zeros(h,w);
= ones(h,w);
= zeros(h,w);
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 120
%
% function flow = flow_extract(flow,h,w)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function flow = flow_extract(flow,h,w)
[oh,ow] = size(flow.m5);
x1 = (ow-w)/2+1;
y1 = (oh-h)/2+1;
x1 = floor(x1);
y1 = floor(y1);
x2 = x1+w-1;
y2 = y1+h-1;
if (isfield(flow,'m1'))
flow.m1 = flow.m1(y1:y2,x1:x2);
end
if (isfield(flow,'m2'))
flow.m2 = flow.m2(y1:y2,x1:x2);
end
if (isfield(flow,'m3'))
flow.m3 = flow.m3(y1:y2,x1:x2);
end
if (isfield(flow,'m4'))
flow.m4 = flow.m4(y1:y2,x1:x2);
end
if (isfield(flow,'m5'))
flow.m5 = flow.m5(y1:y2,x1:x2);
end
if (isfield(flow,'m6'))
flow.m6 = flow.m6(y1:y2,x1:x2);
end
if (isfield(flow,'m7'))
flow.m7 = flow.m7(y1:y2,x1:x2);
end
if (isfield(flow,'m8'))
flow.m8 = flow.m8(y1:y2,x1:x2);
end
if (isfield(flow,'r'))
flow.r = flow.r(y1:y2,x1:x2);
end
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 121
if (isfield(flow,'g'))
flow.g = flow.g(y1:y2,x1:x2);
end
if (isfield(flow,'f'))
flow.f = flow.f(y1:y2,x1:x2);
end
if (isfield(flow,'fx'))
flow.fx = flow.fx(y1:y2,x1:x2);
end
if (isfield(flow,'fy'))
flow.fy = flow.fy(y1:y2,x1:x2);
end
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 122
%
% function flow_disp(flow,skip,color)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function flow_disp(flow,skip,color)
if (nargin == 1)
skip = 8;
end
if (nargin < 3)
color = 'b';
end
[h,w] = size(flow.m5);
m5 = flow.m5(1:skip:h,1:skip:w);
m6 = flow.m6(1:skip:h,1:skip:w);
[flowx flowy] = meshgrid([0:skip:w-1]-w/2+0.5,-([0:skip:h-1]h/2+0.5));
%This little bit helps avoid displaying zero vectors
ind = find(m5 | m6);
m5 = m5(ind);
m6 = m6(ind);
flowx = flowx(ind);
flowy = flowy(ind);
quiver(flowx,-flowy,m5,-m6,0,color);
axis image;
grid on;
axis ij;
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 123
%
% function flow = flow_aff(M,w,h)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function flow = flow_aff(M,w,h)
m
dx
dy
= M(1:2,1:2);
= M(1,3);
= M(2,3);
[mx my]
pnts
vx
vy
vx
vy
vx
vy
flow.m5
flow.m6
=
=
=
=
=
=
=
=
=
=
meshgridimg(w,h);
m * [mx(:)';my(:)'] ;
pnts(1,:) + dx;
pnts(2,:) + dy;
reshape(vx,h,w);
reshape(vy,h,w);
vx - mx;
vy - my;
vx;
vy;
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 124
%
% function [flowAC,img_warped] = flow_add(flowBC,flowAB,img_org)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [flowAC,img_warped] = flow_add(flowBC,flowAB,img_org)
[h,w]
= size(flowAB.m5);
m5
m6
= flow_warp(flowBC.m5,flowAB,'cubic',1);
= flow_warp(flowBC.m6,flowAB,'cubic',1);
n = find(isnan(m5) | isnan(m6));
m5(n) = 0;
m6(n) = 0;
flowAC.m5 = flowAB.m5 + m5;
flowAC.m6 = flowAB.m6 + m6;
if (nargin == 3)
img_warped = flow_warp(img_org,flowAC,'cubic',0);
end
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 125
%
% function [fdx,fdy,fdz] = diffxyt(frame1,frame2,filtsizes)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Filter details:
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
% Reference:
% Optimally Rotation-Equivariant Directional Derivative Kernels
%
H. Farid and E.P. Simoncelli
%
Computer Analysis of Images and Patterns (CAIP), Kiel, Germany,
1997
% See also: http://www.cs.dartmouth.edu/~farid/research/derivative.html
%
function [fdx,fdy,fdz] = diffxyt(frame1,frame2,filtsizes)
[fdx,fdy,fdz] = c_diffxyt(frame1,frame2);
return;
if (nargin == 2)
filtsizes = [3 3];
end
persistent px dx py dy pz dz;
if (isempty(px))
[px,dx] = GetDerivPD(filtsizes(1));
[py,dy] = GetDerivPD(filtsizes(2));
[pz,dz] = GetDerivPD(2);
end
%Step 1: prefilter in t;
%
dx = prefilter in y, differentiate in x
%
dy = prefilter in x, differentiate in y
%frame_pz = frame1 .* pz(1) + frame2 .* pz(2);
frame_pz = (frame1 + frame2)/2;
%fdx = conv2(py,dx',frame_pz,'same');
%fdy = conv2(dy,px',frame_pz,'same');
fdx = conv2mirr(frame_pz,dx,py);
fdy = conv2mirr(frame_pz,px,-dy);
%Step 2: differentiate in t;
%
dz = prefilter in x and y
%frame_dz = frame1 .* dz(1) + frame2 .* dz(2);
frame_dz = frame1 - frame2;
%fdz = conv2(py,px',frame_dz,'same');
fdz = conv2mirr(frame_dz,px,py);
return;
function [p,d] = GetDerivPD(noFrames)
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 126
% Coefficients for smoothing filter p and
% derivitive filter d provided by Hanny Farid
% [email protected]
switch(noFrames)
case 2
p = [0.5 0.5];
d = [-1 1];
case 3
p = [0.223755 0.552490 0.223755];
d = [-0.453014 0.0 0.453014];
case 4
p = [0.092645 0.407355 0.407355 0.092645];
d = [-0.236506 -0.267576 0.267576 0.236506];
case 5
p = [0.036420 0.248972 0.429217 0.248972 0.036420];
d = [-0.108415 -0.280353 0.0 0.280353 0.108415];
case 6
p = [0.013846 0.135816 0.350337 0.350337 0.135816 0.01384];
d = [-0.046266 -0.203121 -0.158152 0.158152 0.203121
0.046266];
case 7
p = [0.005165 0.068654 0.244794 0.362775 0.244794 0.068654
0.005165];
d = [-0.018855 -0.123711 -0.195900 0.0 0.195900 0.123711
0.018855];
otherwise
p = 0;
d = 0;
end
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 127
%
% function out = cutc(img,newW,newH)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function out = cutc(img,newW,newH)
if (nargin == 2)
newH = newW;
end
[h,w] = size(img);
y = round((h-newH)/2)+1;
x = round((w-newW)/2)+1;
out = img(y:y+newH-1,x:x+newW-1);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 128
%USAGE: out = conv2mirr(in,fy,fx)
%
%
This function performs a 2D convolution
%
after mirroring the boundaries.
%
Since matlab's conv2 function processes
%
the columns first, we first mirror the rows.
%
%
If the kernel is non-seperable, pass it
%
in parameter fx and ignore fy.
%
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function out = conv2mirr(in,fx,fy)
[h,w] = size(in);
%Size of the borders to flip
if (nargin == 3)
nl = round((length(fx)-1)/2);
nu = round((length(fy)-1)/2);
else
%non-seperable mask passed
[lfy lfx] = size(fx);
nl = round((lfx-1)/2);
nu = round((lfy-1)/2);
end
nr = nl;
nd = nu;
%First flip up and down
u = flipud(in([2:1+nu],:));
d = flipud(in([h-nd:h-1],:));
in2 = [u' in' d']';
%Next flip left and right
l = fliplr(in2(:, [2:1+nl]));
r = fliplr(in2(:,[w-nr:w-1]));
%set the 'mirrored' image to out.
out = [l in2 r];
if (nargin == 3)
out = conv2(fy,fx,out,'valid');
else
out = conv2(out,fx,'valid');
end
out = out([1:h],[1:w]);
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 129
%test
A = [1 2 3 4;5 6 7 8;9 10 11 12]
B = conv2mirr(A,[1 1 1],[1 1 1])
C = conv2mirr(A,[1 1 1;1 1 1;1 1 1])
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 130
%
% function [M,bnew,cnew,W] = affbc_mult(im1,im2,noIters,model,minBlkSize)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [M,bnew,cnew] = affbc_mult(im1,im2,noIters,model,minBlkSize);
if (nargin == 2)
model = 4;
noIters = 50;
minBlkSize = 32;
end
if (nargin < 6)
minBlkSize = 32;
end
[h,w] = size(im1);
steps = floor(log2(w/minBlkSize)+1);
%steps = 3;
pyr1(1).im = im1;
pyr2(1).im = im2;
%First build pyramids
scale = 1;
for i = 2:steps
pyr1(i).im = reduce(pyr1(i-1).im);
pyr2(i).im = reduce(pyr2(i-1).im);
scale = scale * 2;
end
M = eye(3);
bnew = 0;
cnew = 1;
for i = steps:-1:1
im1S
im2S
= pyr1(i).im;
= pyr2(i).im;
fprintf('affbcmult: scale= %g h=%g w=%g\n',scale,size(im1S));
if (i ~= steps)
M1 = M;
M1(1:2,3) = M1(1:2,3)/scale;
im1S = aff_warp(im1S,M1);
end
%dispimg([im1S,im2S]);
[Mnew,b,c]
= affbc_iter(im1S,im2S,noIters,model);
cnew = c * cnew;
bnew = b + bnew;
Mnew(1:2,3) = Mnew(1:2,3) * scale;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 131
M
= Mnew * M
%Mnew
%M
scale = scale/2;
end
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 132
%
% function affbc_iter(i1,i2,iters,model)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [M,b,c,W] = affbc_iter(i1,i2,iters,model)
if (~exist('model','var'))
model = 4;
end
if (~exist('iters','var'))
iters = 20;
end
txtFlag = 0;
affbc_find_init;
[h,w]
= size(i1);
W
= ones(h,w);
[index] = getindex(model);
c
b
M
i1N
=
=
=
=
1;
0;
[1 0 0; 0 1 0; 0 0 1];
i1;
for i=1:iters
[dM db dc,r] = affbc_find_api(i1N,i2,model);
M
b
c
= M*dM;
= b+db;
= c*dc;
if (c < 0.1)
c = 1;
end
i1N = aff_warp(i1,M,0);
if (txtFlag)
fprintf('Iteration: %d\n',i);
M
fprintf('c: %g, b: %g, mse: %g\n', c,b,mse(i1N,i2));
end
i1N = i1N .* c + b;
end
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 133
%
% function affbc_init
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected]), Dartmouth College.
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function affbc_init
clear diffxyt affbc_find
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 134
% function [M,b,c,r,pt,kt] = affbc_find_api(f,g,model);
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected]), Dartmouth College.
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [M,b,c,r,pt,kt] = affbc_find_api(f,g,model);
global affbc_params;
[h,w]
= size(f);
[fx,fy,ft]
= diffxyt(f,g,[3 3]);
[ind,afFlag,bcFlag] = getindex(model);
affbc_params.h
= h;
affbc_params.w
= w;
affbc_params.model = model;
affbc_params.index = ind;
affbc_params.afFlag = afFlag;
affbc_params.bcFlag = bcFlag;
affbc_params.nf
= -f(:)';
affbc_params.fx
= fx(:)';
affbc_params.fy
= fy(:)';
affbc_params.ft
= ft(:)';
affbc_params.frameSize = 1;
if (~exist('lamdas','var'))
lamdas
= ones(length(ind),1);
deviants = zeros(length(ind),1);
end
if (model == 4)
lamdas
= [1 1 1 1 1 1 1 1]'*10e11;
deviants = [0 0 0 0 0 0 1 0]';
end
affbc_params.S = diag(lamdas);
affbc_params.D = (lamdas .* deviants);
%affbc_params.init = 1;
affbc_find;
mout = affbc_params.mout;
M
c
b
r
=
=
=
=
[mout(1) mout(2) mout(5); mout(3) mout(4) mout(6); 0 0 1];
mout(7);
mout(8);
mout(9);
if (nargout > 4)
pt = affbc_params.pt;
kt = affbc_params.kt;
end
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 135
%
% function affbc_find
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function affbc_find
global affbc_params;
persistent h w mx my H pt m minus_ones afFlag bcFlag iFlag rankE
mout_def
%if (isempty(mx) | affbc_params.init == 1)
if (isempty(mx))
[w,h,mx,my,H,rankE,afFlag,bcFlag,iFlag,minus_ones,mout_def]=...
affbc_init(affbc_params);
affbc_params.init = 0;
affbc_params.mout = [mout_def 0];
end
% premultiply derivatives with box filter
if (affbc_params.frameSize > 0)
affbc_params.fx = affbc_params.fx .* H;
affbc_params.fy = affbc_params.fy .* H;
affbc_params.ft = affbc_params.ft .* H;
affbc_params.nf = affbc_params.nf .* H;
minus_ones = minus_ones .* H;
end
%set
p1 =
p2 =
p3 =
p4 =
entire p transpose
affbc_params.fx .*
affbc_params.fx .*
affbc_params.fy .*
affbc_params.fy .*
mx;
my;
mx;
my;
affbc_params.pt = [p1;p2;p3;p4;...
affbc_params.fx;affbc_params.fy;affbc_params.nf;
minus_ones];
affbc_params.kt = affbc_params.ft;
if (bcFlag)
affbc_params.kt = affbc_params.kt + affbc_params.nf;
end
if (afFlag)
affbc_params.kt = affbc_params.kt +
end
p1+ p4;
%choose only parameters needed
if (iFlag)
affbc_params.pt
= affbc_params.pt(affbc_params.index,:);
end
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 136
%Calculate P = p' * p
P = (affbc_params.pt) * affbc_params.pt';
K = (affbc_params.pt) * affbc_params.kt';
if (rcond(P) > 10e-8)
%if (rank(P) == rankE)
m = inv(P) * K;
%m = inv(P+affbc_params.S) * (K+affbc_params.D);
r = 1;
else
m = mout_def;
r = 0;
end
affbc_params.mout = [1 0 0 1 0 0 1 0 r];
if (iFlag)
affbc_params.mout(affbc_params.index) = m;
else
affbc_params.mout(1:8) = m;
end
return;
function [w,h,mx,my,H,rankE,afFlag,bcFlag,iFlag, o,mout_def]=...
affbc_init(affbc_params)
%Initialize things
%fprintf('affbc_find Initializing...\n');
w
= affbc_params.w;
h
= affbc_params.h;
[mx,my]
= meshgridimg(w,h);
H
= framegen(w,h,affbc_params.frameSize); %box filter
noFields = length(affbc_params.index);
rankE
= noFields;
afFlag
= affbc_params.afFlag;
bcFlag
= affbc_params.bcFlag;
iFlag
= ~(afFlag & bcFlag);
%Expected rank
rankE
= noFields;
o
= -ones(1,h*w);
%linearize into rows
mx = mx(:)';
my = my(:)';
H = H(:)';
%default values for all parameters
mout_def
= [1 0 0 1 0 0 1 0];
%choose only parameters we need
mout_def
= mout_def(affbc_params.index);
%fprintf('affbc_find Done\n');
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 137
%
% function [out] = aff_warp(in,M,contFlag)
%
% Date: April 19, 2003
% By : Senthil Periaswamy ([email protected])
%
% Copyright (c), 2000, Trustees of Dartmouth College. All rights
reserved.
%
function [out] = aff_warp(in,M,contFlag)
if (nargin == 2)
contFlag = 0;
end
m
dx
dy
[h,w]
a
[mx,my]
=
=
=
=
=
=
M(1:2,1:2);
M(1,3);
M(2,3);
size(in);
h*w;
meshgridimg(w,h);
pnts
= m * [mx(:)';my(:)']; % order of pnts does not matter
mx2
my2
= pnts(1,:) + dx;
= pnts(2,:) + dy;
mx2
my2
= reshape(mx2,h,w);
= reshape(my2,h,w);
out
= interp2(mx,my,in,mx2,my2,'cubic');
out(isnan(out)) = 0;
if (contFlag)
out = out * det(M);
end
return;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 138
%
% function fout = waitbar(x,whichbar, varargin)
%
% Modified By: Senthil Periaswamy ([email protected])
%
function fout = waitbar(x,whichbar, varargin)
%WAITBAR Display wait bar.
%
H = WAITBAR(X,'title', property, value, property, value, ...)
%
creates and displays a waitbar of fractional length X. The
%
handle to the waitbar figure is returned in H.
%
X should be between 0 and 1. Optional arguments property and
%
value allow to set corresponding waitbar figure properties.
%
Property can also be an action keyword 'CreateCancelBtn', in
%
which case a cancel button will be added to the figure, and
%
the passed value string will be executed upon clicking on the
%
cancel button or the close figure button.
%
%
WAITBAR(X) will set the length of the bar in the most recently
%
created waitbar window to the fractional length X.
%
%
WAITBAR(X,H) will set the length of the bar in waitbar H
%
to the fractional length X.
%
%
WAITBAR(X,H,'updated title') will update the title text in
%
the waitbar figure, in addition to setting the fractional
%
length to X.
%
%
WAITBAR is typically used inside a FOR loop that performs a
%
lengthy computation. A sample usage is shown below:
%
%
h = waitbar(0,'Please wait...');
%
for i=1:100,
%
% computation here %
%
waitbar(i/100,h)
%
end
%
close(h)
%
%
%
%
Clay M. Thompson 11-9-92
Vlad Kolesnikov 06-7-99
Copyright 1984-2000 The MathWorks, Inc.
$Revision: 1.21 $ $Date: 2000/08/04 15:36:26 $
if nargin>=2
if ischar(whichbar)
type=2; %we are initializing
name=whichbar;
elseif isnumeric(whichbar)
type=1; %we are updating, given a handle
f=whichbar;
else
error(['Input arguments of type ' class(whichbar) ' not valid.'])
end
elseif nargin==1
f = findobj(allchild(0),'flat','Tag','TMWWaitbar');
if isempty(f)
type=2;
name='Waitbar';
else
type=1;
f=f(1);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 139
end
else
error('Input arguments not valid.');
end
x = max(0,min(100*x,100));
switch type
case 1, % waitbar(x)
update
p = findobj(f,'Type','patch');
l = findobj(f,'Type','line');
if isempty(f) | isempty(p) | isempty(l),
error('Couldn''t find waitbar handles.');
end
xpatch = get(p,'XData');
xpatch = [0 x x 0];
set(p,'XData',xpatch)
xline = get(l,'XData');
set(l,'XData',xline);
if nargin>2,
% Update waitbar title:
hAxes = findobj(f,'type','axes');
hTitle = get(hAxes,'title');
set(hTitle,'string',varargin{1});
end
case 2, % waitbar(x,name) initialize
vertMargin = 0;
if nargin > 2,
% we have optional arguments: property-value pairs
if rem (nargin, 2 ) ~= 0
error( 'Optional initialization arguments must be passed in
pairs' );
end
end
oldRootUnits = get(0,'Units');
set(0, 'Units', 'points');
screenSize = get(0,'ScreenSize');
axFontSize=get(0,'FactoryAxesFontSize');
pointsPerPixel = 72/get(0,'ScreenPixelsPerInch');
width = 360 * pointsPerPixel;
height = 75 * pointsPerPixel;
%pos = [screenSize(3)/2-width/2 screenSize(4)/2-height/2 width height];
pos = [0 0 width height];
f = figure(...
'Units', 'points', ...
'BusyAction', 'queue', ...
'Position', pos, ...
'Resize','off', ...
'CreateFcn','', ...
'NumberTitle','off', ...
'IntegerHandle','off', ...
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 140
'MenuBar', 'none', ...
'Tag','TMWWaitbar',...
'Interruptible', 'off', ...
'Visible','off');
%%%%%%%%%%%%%%%%%%%%%
% set figure properties as passed to the fcn
% pay special attention to the 'cancel' request
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if nargin > 2,
propList = varargin(1:2:end);
valueList = varargin(2:2:end);
cancelBtnCreated = 0;
for ii = 1:length( propList )
try
if strcmp(lower(propList{ii}), 'createcancelbtn' ) &
~cancelBtnCreated
cancelBtnHeight = 23 * pointsPerPixel;
cancelBtnWidth = 60 * pointsPerPixel;
newPos = pos;
vertMargin = vertMargin + cancelBtnHeight;
newPos(4) = newPos(4)+vertMargin;
callbackFcn = [valueList{ii}];
set( f, 'Position', newPos, 'CloseRequestFcn',
callbackFcn );
cancelButt = uicontrol('Parent',f, ...
'Units','points', ...
'Callback',callbackFcn, ...
'ButtonDownFcn', callbackFcn,
...
'Enable','on', ...
'Interruptible','off', ...
'Position', [pos(3)cancelBtnWidth*1.4, 7, ...
cancelBtnWidth, cancelBtnHeight], ...
'String','Cancel', ...
'Tag','TMWWaitbarCancelButton');
cancelBtnCreated = 1;
else
% simply set the prop/value pair of the figure
set( f, propList{ii}, valueList{ii});
end
catch
disp ( ['Warning: could not set property ''' propList{ii}
''' with value ''' num2str(valueList{ii}) '''' ] );
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
colormap([]);
axNorm=[.05 .3 .9 .2];
axPos=axNorm.*[pos(3:4),pos(3:4)] + [0 vertMargin 0 0];
h = axes('XLim',[0 100],...
'YLim',[0 1],...
'Box','on', ...
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 141
'Units','Points',...
'FontSize', axFontSize,...
'Position',axPos,...
'XTickMode','manual',...
'YTickMode','manual',...
'XTick',[],...
'YTick',[],...
'XTickLabelMode','manual',...
'XTickLabel',[],...
'YTickLabelMode','manual',...
'YTickLabel',[]);
tHandle=title(name);
tHandle=get(h,'title');
oldTitleUnits=get(tHandle,'Units');
set(tHandle,...
'Units',
'points',...
'String',
name);
tExtent=get(tHandle,'Extent');
set(tHandle,'Units',oldTitleUnits);
titleHeight=tExtent(4)+axPos(2)+axPos(4)+5;
if titleHeight>pos(4)
pos(4)=titleHeight;
pos(2)=screenSize(4)/2-pos(4)/2;
figPosDirty=logical(1);
else
figPosDirty=logical(0);
end
if tExtent(3)>pos(3)*1.10;
pos(3)=min(tExtent(3)*1.10,screenSize(3));
pos(1)=screenSize(3)/2-pos(3)/2;
axPos([1,3])=axNorm([1,3])*pos(3);
set(h,'Position',axPos);
figPosDirty=logical(1);
end
if figPosDirty
set(f,'Position',pos);
end
xpatch
ypatch
xline
yline
=
=
=
=
[0 x
[0 0
[100
[0 0
x
1
0
1
0];
1];
0 100 100];
1 0];
p = patch(xpatch,ypatch,'r','EdgeColor','r','EraseMode','none');
l = line(xline,yline,'EraseMode','none');
set(l,'Color',get(gca,'XColor'));
set(f,'HandleVisibility','callback','visible','on');
set(0, 'Units', oldRootUnits);
end % case
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 142
drawnow;
if nargout==1,
fout = f;
end
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 143
APPENDIX B
ICA MATLAB CODE
%
%
%
%
ICA algorithm
Uses JADE (Joint Approximation Diagonalization of Eigenmatrices)
algorithm for performing ICA
Frame window of 3
clear,close all,clc;
tic;
T1 = 256;
T2 = 256;
N=30;
num=1;
%Read in sequence
mov=aviread('building_site',1:N);
for k=1:N
mov(k).cdata=mov(k).cdata(1:T1,1:T2);
end
% Reshape matrix to fit image in one row
for k=num+1:N-1
k
for f=1:num
i(:,:,f)=mov(k-f).cdata;
i(:,:,f)=i(1:T1,1:T2,f);
im=reshape(i(:,:,f),1,T1*T2);
imf(f,:)=im;
i(:,:,f+num+1)=mov(k+f).cdata;
i(:,:,f+num+1)=i(1:T1,1:T2,f+num+1);
im=reshape(i(:,:,f+num+1),1,T1*T2);
imf(f+num+1,:)=im;
end
i(:,:,num+1)=mov(k).cdata;
i(:,:,num+1)=i(1:T1,1:T2,num+1);
im=reshape(i(:,:,num+1),1,T1*T2);
imf(num+1,:)=im;
X=double(imf);
% Bm is the unmixing matrix and Xs is the mixed matrix
% The matlab estimate
Xs = X ;
Xs = Xs'; Xs = Xs' ;
Bm = MatlabjadeR(Xs);
% um is the unmixed set of images
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 144
um=Bm*Xs;
newframe=abs(um(1,:));
newframe=uint8((newframe./max(max(newframe)))*255);
final(k-num,:)=newframe;
end
% Reshape images back to two dimensions
for k=num+1:N-2
umtemp(:,:)=reshape(final(k-num,:),T1,T2);
umf(:,:,k-num)=umtemp;
end
toc;
% Convert to movie frames and play sequence
for k=num+1:N-2
map=gray(256);
mov1(k-num) = im2frame(umf(:,:,k-num),map);
%mov1(k).colormap=gray(236);
end
map=gray(256);
for k=num+1:N-2
temp1=(mat2gray(mov1(k-num).cdata));
mov1(k-num)=im2frame(im2uint8(temp1),map);
temp2=(mat2gray(mov(k-num).cdata));
mov(k-num)=im2frame(im2uint8(temp2),map);
%mov(k)=mat2gray(mov(k).cdata);
end
mplay(mov1);
mplay(mov);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 145
function B = jadeR(X,m)
% Blind separation of real signals with JADE. Version 1.5 Dec. 1997.
%
% Usage:
%
* If X is an nxT data matrix (n sensors, T samples) then
%
B=jadeR(X) is a nxn separating matrix such that S=B*X is an nxT
%
matrix of estimated source signals.
%
* If B=jadeR(X,m), then B has size mxn so that only m sources are
%
extracted. This is done by restricting the operation of jadeR
%
to the m first principal components.
%
* Also, the rows of B are ordered such that the columns of pinv(B)
%
are in order of decreasing norm; this has the effect that the
%
`most energetically significant' components appear first in the
%
rows of S=B*X.
%
% Quick notes (more at the end of this file)
%
% o this code is for REAL-valued signals. An implementation of JADE
%
for both real and complex signals is also available from
%
http://sig.enst.fr/~cardoso/stuff.html
%
% o This algorithm differs from the first released implementations of
%
JADE in that it has been optimized to deal more efficiently
%
1) with real signals (as opposed to complex)
%
2) with the case when the ICA model does not necessarily hold.
%
% o There is a practical limit to the number of independent
%
components that can be extracted with this implementation. Note
%
that the first step of JADE amounts to a PCA with dimensionality
%
reduction from n to m (which defaults to n). In practice m
%
cannot be `very large' (more than 40, 50, 60... depending on
%
available memory)
%
% o See more notes, references and revision history at the end of
%
this file and more stuff on the WEB
%
http://sig.enst.fr/~cardoso/stuff.html
%
% o This code is supposed to do a good job! Please report any
%
problem to [email protected]
% Copyright : Jean-Francois Cardoso.
verbose = 0 ;
[email protected]
% Set to 0 for quiet operation
% Finding the number of sources
[n,T]
= size(X);
if nargin==1, m=n ; end;
% Number of sources defaults to # of sensors
if m>n ,
fprintf('jade -> Do not ask more sources than sensors
here!!!\n'), return,end
if verbose, fprintf('jade -> Looking for %d sources\n',m); end ;
% Self-commenting code
%=====================
if verbose, fprintf('jade -> Removing the mean value\n'); end
X
= X - mean(X')' * ones(1,T);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 146
%%% whitening & projection onto signal subspace
%
===========================================
if verbose, fprintf('jade -> Whitening the data\n'); end
[U,D]
= eig((X*X')/T) ;
[puiss,k] = sort(diag(D)) ;
rangeW
= n-m+1:n
; % indices to the m most significant
directions
scales
= sqrt(puiss(rangeW))
; % scales
W
= diag(1./scales) * U(1:n,k(rangeW))' ;
% whitener
iW
= U(1:n,k(rangeW)) * diag(scales)
;
% its pseudo-inverse
X
= W*X;
%%% Estimation of the cumulant matrices.
%
====================================
if verbose, fprintf('jade -> Estimating cumulant matrices\n'); end
dimsymm
nbcm
CM
R
Qij
Xim
Xjm
scale
=
=
=
=
= (m*(m+1))/2; % Dim. of the space of real symm matrices
= dimsymm ;
% number of cumulant matrices
zeros(m,m*nbcm); % Storage for cumulant matrices
eye(m);
%%
= zeros(m); % Temp for a cum. matrix
zeros(1,m);
% Temp
zeros(1,m);
% Temp
= ones(m,1)/T ; % for convenience
%% I am using a symmetry trick to save storage. I should write a
%% short note one of these days explaining what is going on here.
%%
Range
= 1:m ; % will index the columns of CM where to store the
cum. mats.
for im = 1:m
Xim = X(im,:) ;
Qij = ((scale* (Xim.*Xim)) .* X ) * X' - R - 2 * R(:,im)*R(:,im)' ;
CM(:,Range) = Qij ;
Range
= Range + m ;
for jm = 1:im-1
Xjm = X(jm,:) ;
Qij = ((scale * (Xim.*Xjm) ) .*X ) * X' - R(:,im)*R(:,jm)' R(:,jm)*R(:,im)' ;
CM(:,Range) = sqrt(2)*Qij ;
Range
= Range + m ;
end ;
end;
%%% joint diagonalization of the cumulant matrices
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Init
if 1,
%% Init by diagonalizing a *single* cumulant matrix. It seems to
save
%% some computation time `sometimes'. Not clear if initialization is
%% a good idea since Jacobi rotations are very efficient.
if verbose, fprintf('jade -> Initialization of the
diagonalization\n'); end
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 147
[V,D]
= eig(CM(:,1:m));
% For instance, this one
for u=1:m:m*nbcm,
% updating accordingly the cumulant set given
the init
CM(:,u:u+m-1) = CM(:,u:u+m-1)*V ;
end;
CM = V'*CM;
else,
V
end;
%% The dont-try-to-be-smart init
= eye(m) ; % la rotation initiale
seuil
= 1/sqrt(T)/100; % A statistically significant threshold
encore = 1;
sweep
= 0;
updates = 0;
g
= zeros(2,nbcm);
gg = zeros(2,2);
G
= zeros(2,2);
c
= 0 ;
s
= 0 ;
ton = 0 ;
toff
= 0 ;
theta
= 0 ;
%% Joint diagonalization proper
if verbose, fprintf('jade -> Contrast optimization by joint
diagonalization\n'); end
while encore, encore=0;
if verbose, fprintf('jade -> Sweep #%d\n',sweep); end
sweep=sweep+1;
for p=1:m-1,
for q=p+1:m,
Ip = p:m:m*nbcm ;
Iq = q:m:m*nbcm ;
%%% computation of Givens angle
g
= [ CM(p,Ip)-CM(q,Iq) ; CM(p,Iq)+CM(q,Ip) ];
gg = g*g';
ton
= gg(1,1)-gg(2,2);
toff
= gg(1,2)+gg(2,1);
theta
= 0.5*atan2( toff , ton+sqrt(ton*ton+toff*toff) );
%%% Givens update
if abs(theta) > seuil, encore = 1 ;
updates = updates + 1;
c
= cos(theta);
s
= sin(theta);
G
= [ c -s ; s c ] ;
pair
= [p;q] ;
V(:,pair)
= V(:,pair)*G ;
CM(pair,:) = G' * CM(pair,:) ;
CM(:,[Ip Iq])
= [ c*CM(:,Ip)+s*CM(:,Iq) -s*CM(:,Ip)+c*CM(:,Iq)
] ;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 148
%% fprintf('jade -> %3d %3d %12.8f\n',p,q,s);
end%%of the if
end%%of the loop on q
end%%of the loop on p
end%%of the while loop
if verbose, fprintf('jade -> Total of %d Givens rotations\n',updates);
end
%%% A separating matrix
%
===================
B
= V'*W ;
%%% We permut its rows to get the most energetic components first.
%%% Here the **signals** are normalized to unit variance. Therefore,
%%% the sort is according to the norm of the columns of A = pinv(B)
if verbose, fprintf('jade -> Sorting the components\n',updates); end
A
= iW*V ;
[vars,keys] = sort(sum(A.*A)) ;
B
= B(keys,:);
B
= B(m:-1:1,:) ; % Is this smart ?
% Signs are fixed by forcing the first column of B to have
% non-negative entries.
if verbose, fprintf('jade -> Fixing the signs\n',updates); end
b
= B(:,1) ;
signs
= sign(sign(b)+0.1) ; % just a trick to deal with sign=0
B
= diag(signs)*B ;
return ;
% To do.
%
- Implement a cheaper/simpler whitening (is it worth it?)
%
% Revision history:
%
%- V1.5, Dec. 24 1997
%
- The sign of each row of B is determined by letting the first
%
element be positive.
%
%- V1.4, Dec. 23 1997
%
- Minor clean up.
%
- Added a verbose switch
%
- Added the sorting of the rows of B in order to fix in some
%
reasonable way the permutation indetermination. See note 2)
%
below.
%
%- V1.3, Nov. 2 1997
%
- Some clean up. Released in the public domain.
%
%- V1.2, Oct. 5 1997
%
- Changed random picking of the cumulant matrix used for
%
initialization to a deterministic choice. This is not because
%
of a better rationale but to make the ouput (almost surely)
%
deterministic.
%
- Rewrote the joint diag. to take more advantage of Matlab's
%
tricks.
%
- Created more dummy variables to combat Matlab's loose memory
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 149
%
management.
%
%- V1.1, Oct. 29 1997.
%
Made the estimation of the cumulant matrices more regular. This
%
also corrects a buglet...
%
%- V1.0, Sept. 9 1997. Created.
%
% Main reference:
% @article{CS-iee-94,
% title
= "Blind beamforming for non {G}aussian signals",
% author
= "Jean-Fran\c{c}ois Cardoso and Antoine Souloumiac",
% HTML
= "ftp://sig.enst.fr/pub/jfc/Papers/iee.ps.gz",
% journal
= "IEE Proceedings-F",
% month = dec, number = 6, pages = {362-370}, volume = 140, year = 1993}
%
% Notes:
% ======
%
% Note 1)
%
% The original Jade algorithm/code deals with complex signals in
% Gaussian noise white and exploits an underlying assumption that the
% model of independent components actually holds. This is a
% reasonable assumption when dealing with some narrowband signals.
% In this context, one may i) seriously consider dealing precisely
% with the noise in the whitening process and ii) expect to use the
% small number of significant eigenmatrices to efficiently summarize
% all the 4th-order information. All this is done in the JADE
% algorithm.
%
% In this implementation, we deal with real-valued signals and we do
% NOT expect the ICA model to hold exactly. Therefore, it is
% pointless to try to deal precisely with the additive noise and it
% is very unlikely that the cumulant tensor can be accurately
% summarized by its first n eigen-matrices. Therefore, we consider
% the joint diagonalization of the whole set of eigen-matrices.
% However, in such a case, it is not necessary to compute the
% eigenmatrices at all because one may equivalently use `parallel
% slices' of the cumulant tensor. This part (computing the
% eigen-matrices) of the computation can be saved: it suffices to
% jointly diagonalize a set of cumulant matrices. Also, since we are
% dealing with reals signals, it becomes easier to exploit the
% symmetries of the cumulants to further reduce the number of
% matrices to be diagonalized. These considerations, together with
% other cheap tricks lead to this version of JADE which is optimized
% (again) to deal with real mixtures and to work `outside the model'.
% As the original JADE algorithm, it works by minimizing a `good set'
% of cumulants.
%
% Note 2)
%
% The rows of the separating matrix B are resorted in such a way that
% the columns of the corresponding mixing matrix A=pinv(B) are in
% decreasing order of (Euclidian) norm. This is a simple, `almost
% canonical' way of fixing the indetermination of permutation. It
% has the effect that the first rows of the recovered signals (ie the
% first rows of B*X) correspond to the most energetic *components*.
% Recall however that the source signals in S=B*X have unit variance.
% Therefore, when we say that the observations are unmixed in order
% of decreasing energy, the energetic signature is found directly as
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 150
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
the norm of the columns of A=pinv(B).
Note 3)
In experiments where JADE is run as B=jadeR(X,m) with m varying in
range of values, it is nice to be able to test the stability of the
decomposition. In order to help in such a test, the rows of B can
be sorted as described above. We have also decided to fix the sign
of each row in some arbitrary but fixed way. The convention is
that the first element of each row of B is positive.
Note 4)
Contrary to many other ICA algorithms, JADE (or least this version)
does not operate on the data themselves but on a statistic (the
full set of 4th order cumulant). This is represented by the matrix
CM below, whose size grows as m^2 x m^2 where m is the number of
sources to be extracted (m could be much smaller than n). As a
consequence, (this version of) JADE will probably choke on a
`large' number of sources. Here `large' depends mainly on the
available memory and could be something like 40 or so. One of
these days, I will prepare a version of JADE taking the `data'
option rather than the `statistic' option.
% JadeR.m ends here.
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 151
APPENDIX C
CGI MATLAB CODE
% Algorithm using CGI registration and trajectory estimation
% Using a frame window of size 10
clear,close all,clc;
N=30;
w=5; % window for cgi 5=window of +5/-5, 6=window of +6/-6 , etc
mov=aviread('building_site',580:629);
% Calculate motion between current frame and other frames
tic;
for k=w+1:N-w
k
current=mov(k).cdata;
for iter=1:w
[u v]=cgi_frakes(current,mov(k-iter).cdata);
uf(:,:,iter)=u;
vf(:,:,iter)=v;
[u v]=cgi_frakes(current,mov(k+iter).cdata);
uf(:,:,iter+w)=u;
vf(:,:,iter+w)=v;
end
% Comupte the mean value of the trajectory
cu(:,:,1)=(sum(uf,3))./((2*w)+1);
cv(:,:,1)=(sum(vf,3))./((2*w)+1);
% Dewarp the image to the geometrically improved estimate.
x=(double(mov(k).cdata))/255;
result(:,:,k-w)=mdewarpfinal(x,cu,cv);
end
toc;
% Create a movie sequnce and play
for k=1:N-(2*w)
map=gray(256);
mov1(k) = im2frame(result(:,:,k)*255,map);
end
map=gray(256);
for k=1:N-(2*w)
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 152
temp1=(mat2gray(mov1(k).cdata));
mov1(k)=im2frame(im2uint8(temp1),map);
temp2=(mat2gray(mov(k).cdata));
mov(k)=im2frame(im2uint8(temp2),map);
%mov(k)=mat2gray(mov(k).cdata);
end
mplay(mov1);
mplay(mov);
%save('buildingsiteseqout_580to629_cgi','mov1');
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 153
function [u v]=cgi_frakes(i1,i2)
im1=double(i1);
im2=double(i2);
windowSize=5; % Select odd windows greater than 3
cp=5;
[fx, fy, ft] = ComputeDerivatives(im1, im2);
%[fx fy ft]=deriv_farid(im1,im2);
u = zeros(size(im1));
v = zeros(size(im2));
halfWindow = floor(windowSize/2);
for i = halfWindow+1:cp:size(fx,1)-halfWindow
for j = halfWindow+1:cp:size(fx,2)-halfWindow
% calculates the partial derivatives within the image windowsize
curFx = fx(i-halfWindow:i+halfWindow, j-halfWindow:j+halfWindow);
curFy = fy(i-halfWindow:i+halfWindow, j-halfWindow:j+halfWindow);
curFt = ft(i-halfWindow:i+halfWindow, j-halfWindow:j+halfWindow);
curFx = curFx';
curFy = curFy';
curFt = curFt';
% Takes
curFx =
curFy =
curFt =
the matrices and arranges them into vectors
curFx(:);
curFy(:);
-curFt(:);
curFxb=[curFx curFx curFx curFx curFy curFy curFy curFy];
inca=halfWindow+1;
for a=1:windowSize:windowSize*windowSize
incb=halfWindow+1;
inca=inca-1;
for b=1:windowSize
incb=incb-1;
curFx2(a+b-1,:)=[1 i-inca j-incb (i-inca)*(j-incb) 1 iinca j-incb (i-inca)*(j-incb)].*curFxb(a+b-1,:);
end
end
A = curFx2;
% Least squares to estimate parameters for interpolation
U = pinv(A'*A)*A'*curFt;
% Perform interpolation within the window
cntr1=halfWindow+1;
for a=1:cp
cntr2=halfWindow+1;
cntr1=cntr1-1;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 154
for b=1:cp
cntr2=cntr2-1;
u(i-cntr1,j-cntr2)=[1 i-cntr1 j-cntr2 (i-cntr1)*(jcntr2)]*U(1:4);
v(i-cntr1,j-cntr2)=[1 i-cntr1 j-cntr2 (i-cntr1)*(jcntr2)]*U(5:8);
end
end
end;
end;
u(isnan(u))=0;
v(isnan(v))=0;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 155
APPENDIX D
WIENER FILTER AND KURTOSIS MATLAB CODE
% Implements kurtosis minimization algorithm between 0.00025 and 0.0025
% search space
clear,close all,clc;
tic;
load buildingsiteout_1to20_cgi;
mov=mov1;
clear mov1;
N=1;
nsr=0.0001; % estimated
for iter=1:N
iter
i2=mov(iter).cdata;
i2=double(i2);
% taper image for preprocessing
htaper=fspecial('gaussian',5,5);
i2=edgetaper(i2,htaper);
lambda=0.00025;
for v=1:125
iwnr=func_wnr2(i2,lambda,nsr);
lambda=lambda+0.00002;
% Calculate Kurtosis
s=size(iwnr,1)*size(iwnr,2);
iwnrtemp=reshape(iwnr,[1 s]);
k(v,1)=kurtosis(double(iwnrtemp));
k(v,2)=lambda-0.00002;
%k(v,3)=rish_psnr((iwnr),(i2));
end
%normalize kurtosis
x=k-min(k(:,1));
x=x./max(x(:,1));
x(:,2)=k(:,2)
[q p]=min(x(:,1))
toc;
frame_c(:,:,iter)=func_wnr(i2,x(p,2),nsr);
end
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 156
for iter=1:N
map=gray(256);
mov1(iter) = im2frame(uint8(frame_c(:,:,iter)),map);
end
map=gray(256);
for iter=1:N
temp1=(mat2gray(mov1(iter).cdata));
mov1(iter)=im2frame(im2uint8(temp1),map);
%mov(k)=mat2gray(mov(k).cdata);
end
mplay(mov1);
%save('armscorseqout_1to96_kurtosiscgi','mov1');
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 157
% Wiener filter using the turbulence degradation function
function i2final=func_wnr2(i2,k,nsr)
i2=double(i2);
[r c]=size(i2);
% Pre-prcessing of image
% Centres the image frequency transform
for x=1:r
for y=1:c
i2(x,y)=i2(x,y)*((-1)^(x+y));
end
end
% Calculate DFT
i2freq=fft2(i2);
% Calculate the OTF for the blur
% "u-r/2" and "v-c/2" are used to centre the transform
H=zeros(r,c);
for u=1:r
for v=1:c
H(u,v)=exp(-k*((u-r/2)^2+(v-c/2)^2)^(5/6));
end
end
% Calculate filtered image
filt=zeros(r,c);
for u=1:r
for v=1:c
%filt(u,v)=i2freq(u,v)./(H(u,v)+nsr);
filt(u,v)=((i2freq(u,v))*(abs(H(u,v))^2))/((H(u,v)*((abs(H(u,v))^2)+nsr))
);
end
end
% Calculate inverse DFT
i2deblur=ifft2(filt);
i2deblur=real(i2deblur);
% Post-processing of image
% Multiply by (-1) to "de-centre" the transform
i2final=zeros(r,c);
for x=1:r
for y=1:c
i2final(x,y)=i2deblur(x,y)*((-1)^(x+y));
end
end
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 158
APPENDIX E
GENERAL ALGORITHM MATLAB CODE
% Time-averaged algorithm using Lucas-Kanade algorithm
% for registration
% Averaging window is 10
clear,close all,clc;
N=28; % frame length
avelength=10; % averaging length
ave_total=0.00;
mov=aviread('shack',1:25);
% for k=1:N
%
mov(k).cdata=rgb2gray(mov(k).cdata);
% end
for k=1:N
in(:,:,k)=im2double(mov(k).cdata);
end
tic;
% Generate reference frame through averaging
for k=1:avelength % averaging length
ave_total=in(:,:,k)+ave_total;
end
average=ave_total/avelength;
% Calculate motion vectors and warp frames to reference frame
for k=1:N
im2=in(:,:,k);
[u,v] = HierarchicalLK(im2, average, 1, 5,1,0);
res(:,:,k)=mdewarpfinal(in(:,:,k),u,v);
end
toc;
% Create movie frames and play sequence
for k=1:N
map=gray(256);
mov1(k) = im2frame(res(:,:,k)*255,map);
end
map=gray(256);
for k=1:N
temp1=(mat2gray(mov1(k).cdata));
mov1(k)=im2frame(im2uint8(temp1),map);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 159
temp2=(mat2gray(mov(k).cdata));
mov(k)=im2frame(im2uint8(temp2),map);
%mov(k)=mat2gray(mov(k).cdata);
end
mplay(mov1);
outvid='shackseq_1to25_ta';
%movie2avi(mov1,outvid,'fps',20,'compression','None');
save(outvid,'mov1');
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 160
function [u,v,cert] = HierarchicalLK(im1, im2, numLevels, windowSize,
iterations, display)
%HIERARCHICALLK
Hierarchical Lucas Kanade (using pyramids)
%
[u,v]=HierarchicalLK(im1, im2, numLevels, windowSize,
iterations, display)
%
Tested for pyramids of height 1, 2, 3 only...
operation with
%
pyramids of height 4 might be unreliable
%
%
Use quiver(u, -v, 0) to view the results
%
%
NUMLEVELS
Pyramid Levels (typical value 3)
%
WINDOWSIZE
Size of smoothing window (typical value
1-4)
%
ITERATIONS
number of iterations (typical value 1-5)
%
DISPLAY
1 to display flow fields (1 or 0)
%
%Uses: Reduce, Expand
%
% Sohaib Khan
%
edited 05-15-03 (Yaser)
% [email protected]
%
% [1]
B.D. Lucas and T. Kanade, "An Iterative Image Registration
technique,
%
with an Application to Stero Vision," Int'l Joint Conference
Artifical
%
Intelligence, pp. 121-130, 1981.
if (size(im1,1)~=size(im2,1)) | (size(im1,2)~=size(im2,2))
error('images are not same size');
end;
if (size(im1,3) ~= 1) | (size(im2, 3) ~= 1)
error('input should be gray level images');
end;
% check image sizes and crop if not divisible
if (rem(size(im1,1), 2^(numLevels - 1)) ~= 0)
warning('image will be cropped in height, size of output will be
smaller than input!');
im1 = im1(1:(size(im1,1) - rem(size(im1,1), 2^(numLevels - 1))), :);
im2 = im2(1:(size(im1,1) - rem(size(im1,1), 2^(numLevels - 1))), :);
end;
if (rem(size(im1,2), 2^(numLevels - 1)) ~= 0)
warning('image will be cropped in width, size of output will be
smaller than input!');
im1 = im1(:, 1:(size(im1,2) - rem(size(im1,2), 2^(numLevels - 1))));
im2 = im2(:, 1:(size(im1,2) - rem(size(im1,2), 2^(numLevels - 1))));
end;
%Build Pyramids
pyramid1 = im1;
pyramid2 = im2;
for i=2:numLevels
im1 = Reduce(im1);
im2 = Reduce(im2);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 161
pyramid1(1:size(im1,1), 1:size(im1,2), i) = im1;
pyramid2(1:size(im2,1), 1:size(im2,2), i) = im2;
end;
% base level computation
disp('Computing Level 1');
baseIm1 = pyramid1(1:(size(pyramid1,1)/(2^(numLevels-1))),
1:(size(pyramid1,2)/(2^(numLevels-1))), numLevels);
baseIm2 = pyramid2(1:(size(pyramid2,1)/(2^(numLevels-1))),
1:(size(pyramid2,2)/(2^(numLevels-1))), numLevels);
[u,v] = LucasKanade(baseIm1, baseIm2, windowSize);
for r = 1:iterations
[u, v] = LucasKanadeRefined(u, v, baseIm1, baseIm2);
end
%propagating flow 2 higher levels
for i = 2:numLevels
disp(['Computing Level ', num2str(i)]);
uEx = 2 * imresize(u,size(u)*2);
% use appropriate expand function
(gaussian, bilinear, cubic, etc).
vEx = 2 * imresize(v,size(v)*2);
curIm1 = pyramid1(1:(size(pyramid1,1)/(2^(numLevels - i))),
1:(size(pyramid1,2)/(2^(numLevels - i))), (numLevels - i)+1);
curIm2 = pyramid2(1:(size(pyramid2,1)/(2^(numLevels - i))),
1:(size(pyramid2,2)/(2^(numLevels - i))), (numLevels - i)+1);
[u, v] = LucasKanadeRefined(uEx, vEx, curIm1, curIm2);
for r = 1:iterations
[u, v, cert] = LucasKanadeRefined(u, v, curIm1, curIm2);
end
end;
if (display==1)
figure, quiver(Reduce((Reduce(medfilt2(flipud(u),[5 5])))), Reduce((Reduce(medfilt2(flipud(v),[5 5])))), 0), axis equal
end
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 162
function [u,v,cert] = LucasKanadeRefined(uIn, vIn, im1, im2);
% Lucas Kanade Refined computes lucas kanade flow at the current level
given previous estimates!
%current implementation is only for a 3x3 window
%[fx, fy, ft] = ComputeDerivatives(im1, im2);
uIn = round(uIn);
vIn = round(vIn);
%uIn = uIn(2:size(uIn,1), 2:size(uIn, 2)-1);
%vIn = vIn(2:size(vIn,1), 2:size(vIn, 2)-1);
u = zeros(size(im1));
v = zeros(size(im2));
%to compute derivatives, use a 5x5 block... the resulting derivative will
be 5x5...
% take the middle 3x3 block as derivative
for i = 3:size(im1,1)-2
for j = 3:size(im2,2)-2
% if uIn(i,j)~=0
%
disp('ha');
% end;
curIm1 = im1(i-2:i+2, j-2:j+2);
lowRindex = i-2+vIn(i,j);
highRindex = i+2+vIn(i,j);
lowCindex = j-2+uIn(i,j);
highCindex = j+2+uIn(i,j);
if (lowRindex < 1)
lowRindex = 1;
highRindex = 5;
end;
if (highRindex > size(im1,1))
lowRindex = size(im1,1)-4;
highRindex = size(im1,1);
end;
if (lowCindex < 1)
lowCindex = 1;
highCindex = 5;
end;
if (highCindex > size(im1,2))
lowCindex = size(im1,2)-4;
highCindex = size(im1,2);
end;
if isnan(lowRindex)
lowRindex = i-2;
highRindex = i+2;
end;
if isnan(lowCindex)
lowCindex = j-2;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 163
highCindex = j+2;
end;
curIm2 = im2(lowRindex:highRindex, lowCindex:highCindex);
[curFx,
curFx =
curFy =
curFt =
curFy, curFt]=ComputeDerivatives(curIm1, curIm2);
curFx(2:4, 2:4);
curFy(2:4, 2:4);
curFt(2:4, 2:4);
curFx = curFx';
curFy = curFy';
curFt = curFt';
curFx = curFx(:);
curFy = curFy(:);
curFt = -curFt(:);
A = [curFx curFy];
U = pinv(A'*A)*A'*curFt;
u(i,j)=U(1);
v(i,j)=U(2);
cert(i,j) = rcond(A'*A);
end;
end;
u = u+uIn;
v = v+vIn;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [fx, fy, ft] = ComputeDerivatives(im1, im2);
%ComputeDerivatives Compute horizontal, vertical and time derivative
%
between two gray-level images.
if (size(im1,1) ~= size(im2,1)) | (size(im1,2) ~= size(im2,2))
error('input images are not the same size');
end;
if (size(im1,3)~=1) | (size(im2,3)~=1)
error('method only works for gray-level images');
end;
fx = conv2(im1,0.25* [-1 1; -1 1]) + conv2(im2, 0.25*[-1 1; -1 1]);
fy = conv2(im1, 0.25*[-1 -1; 1 1]) + conv2(im2, 0.25*[-1 -1; 1 1]);
ft = conv2(im1, 0.25*ones(2)) + conv2(im2, -0.25*ones(2));
% make same size as input
fx=fx(1:size(fx,1)-1, 1:size(fx,2)-1);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 164
fy=fy(1:size(fy,1)-1, 1:size(fy,2)-1);
ft=ft(1:size(ft,1)-1, 1:size(ft,2)-1);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 165
function [u, v] = LucasKanade(im1, im2, windowSize);
%LucasKanade lucas kanade algorithm, without pyramids (only 1 level);
%REVISION: NaN vals are replaced by zeros
[fx, fy, ft] = ComputeDerivatives(im1, im2);
u = zeros(size(im1));
v = zeros(size(im2));
halfWindow = floor(windowSize/2);
for i = halfWindow+1:size(fx,1)-halfWindow
for j = halfWindow+1:size(fx,2)-halfWindow
curFx = fx(i-halfWindow:i+halfWindow, j-halfWindow:j+halfWindow);
curFy = fy(i-halfWindow:i+halfWindow, j-halfWindow:j+halfWindow);
curFt = ft(i-halfWindow:i+halfWindow, j-halfWindow:j+halfWindow);
curFx = curFx';
curFy = curFy';
curFt = curFt';
curFx = curFx(:);
curFy = curFy(:);
curFt = -curFt(:);
A = [curFx curFy];
U = pinv(A'*A)*A'*curFt;
u(i,j)=U(1);
v(i,j)=U(2);
end;
end;
u(isnan(u))=0;
v(isnan(v))=0;
%u=u(2:size(u,1), 2:size(u,2));
%v=v(2:size(v,1), 2:size(v,2));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%
function [fx, fy, ft] = ComputeDerivatives(im1, im2);
%ComputeDerivatives Compute horizontal, vertical and time derivative
%
between two gray-level images.
if (size(im1,1) ~= size(im2,1)) | (size(im1,2) ~= size(im2,2))
error('input images are not the same size');
end;
if (size(im1,3)~=1) | (size(im2,3)~=1)
error('method only works for gray-level images');
end;
%fx = conv2(im1,(1/6)* [-0.453014 0 0.453014;-0.453014 0 0.453014]) +
conv2(im2, (1/6)*[-0.453014 0 0.453014;-0.453014 0 0.453014]);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 166
%fy = conv2(im1,(1/6)* [-0.453014 0 0.453014;-0.453014 0 0.453014]') +
conv2(im2, (1/6)*[-0.453014 0 0.453014;-0.453014 0 0.453014]');
fx = conv2(im1,0.25* [-1 1; -1 1]) + conv2(im2, 0.25*[-1 1; -1 1]);
fy = conv2(im1, 0.25*[-1 -1; 1 1]) + conv2(im2, 0.25*[-1 -1; 1 1]);
ft = conv2(im1, 0.25*ones(2)) + conv2(im2, -0.25*ones(2));
% make same size as input
fx=fx(1:size(fx,1)-1, 1:size(fx,2)-1);
fy=fy(1:size(fy,1)-1, 1:size(fy,2)-1);
ft=ft(1:size(ft,1)-1, 1:size(ft,2)-1);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 167
APPENDIX F
WARPING ALGORITHM MATLAB CODE
function res=mdewarpfinal(I,u,v)
% Warping algortihm that dewarps images
%% Read Image
[r c]=size(I);
%% Create shift matrix and indices matrix
%move pixels a maximum of two for now to prevent discontinuities
%morph has same dimensions as I to map each pixel
morph1=u;
morph2=v;
tempx=1:c;
tempy=(1:r)';
% Generate matrix of indices
indicex=zeros(r,c);
indicey=zeros(r,c);
for k=1:r
indicex(k,:)=tempx;
end
for k=1:c
indicey(:,k)=tempy;
end
%% Intermediate matrix
interx=indicex-morph1;
intery=indicey-morph2;
% remove all values less than 1
[r1 c1]=find((interx<1) | (interx>c));
[r2 c2]=find((intery<1) | (intery>r));
for k=1:size(r1)
for j=1:size(c1)
if (interx(r1(k),c1(j))<1)
interx(r1(k),c1(j))=1;
elseif (interx(r1(k),c1(j))>c)
interx(r1(k),c1(j))=c;
end
end
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 168
end
for k=1:size(r2)
for j=1:size(c2)
if (intery(r2(k),c2(j))<1)
intery(r2(k),c2(j))=1;
elseif (intery(r2(k),c2(j))>r)
intery(r2(k),c2(j))=r;
end
end
end
%% Calculate weighting parameters
x1 = floor(interx);
x2 = ceil(interx);
fx1 = (x2-interx);
fx2 = 1-fx1;
y1 = floor(intery);
y2 = ceil(intery);
fy1 = y2-intery;
fy2 = 1-fy1;
% Compute the new grayvalue of the current pixel
I=double(I);
for k=1:r
for j=1:c
res(k,j) = fx1(k,j)*fy1(k,j)*I(y1(k,j),x1(k,j)) +
fy1(k,j)*fx2(k,j)*I(y1(k,j),x2(k,j)) +
fy2(k,j)*fx1(k,j)*I(y2(k,j),x1(k,j)) +
fy2(k,j)*fx2(k,j)*I(y2(k,j),x2(k,j));
end
end
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 169
APPENDIX G
GRAPHICAL USER INTERFACE MATLAB CODE
function varargout = Ver1(varargin)
% VER1 M-file for Ver1.fig
% Begin initialization code
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @Ver1_OpeningFcn, ...
'gui_OutputFcn', @Ver1_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
% --- Executes just before Ver1 is made visible.
function Ver1_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 Ver1 (see VARARGIN)
% Choose default command line output for Ver1
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes Ver1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = Ver1_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;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 170
% --- Executes on button press in Open.
function Open_Callback(hObject, eventdata, handles)
% hObject
handle to Open (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
[FileName,PathName] =
uigetfile({'*.tiff;*.jpeg;*.jpg;*.tif;*.png;*.gif','All Image Files';...
'*.*','All Files' });
if (FileName~=0)
im1=imread(strcat(PathName,FileName));
imshow(strcat(PathName,FileName));
handles.orig=im1;
handles.filename=strcat(PathName,FileName);
guidata(hObject,handles)
%mov=aviread('lennablur_001_5');
%movie(handles.axes2,mov);
end
% --- Executes on button press in Process.
function Process_Callback(hObject, eventdata, handles)
% hObject
handle to Process (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
d=get(handles.Distortion);
b=get(handles.Blurring);
d.Value
b.Value/10000
%x=get(handles.handleim);
im2=(handles.orig);
if size(im2,3)>1
im2=rgb2gray(im2);
end
I=im2;
n=d.Value;
k=b.Value/10000;
res=simulateblur2(I,n);
res=func_blur(res,k);
handles.im1=res;
guidata(hObject,handles)
imshow(handles.im1,[]);
% --- Executes on button press in Save.
function Save_Callback(hObject, eventdata, handles)
% hObject
handle to Save (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 171
[file,path] = uiputfile('*.avi','Save Sequence As');
movie2avi(handles.mov,strcat(path,file),'compression','none');
% --- Executes on button press in Play.
function Play_Callback(hObject, eventdata, handles)
% hObject
handle to Play (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
set(handles.axes1,'nextplot','replacechildren','units','normalized');
newplot;
movie(handles.axes1,handles.movx);
% --- Executes on slider movement.
function Distortion_Callback(hObject, eventdata, handles)
% hObject
handle to Distortion (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
% --- Executes during object creation, after setting all properties.
function Distortion_CreateFcn(hObject, eventdata, handles)
% hObject
handle to Distortion (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.
if isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on slider movement.
function Blurring_Callback(hObject, eventdata, handles)
% hObject
handle to Blurring (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
% --- Executes during object creation, after setting all properties.
function Blurring_CreateFcn(hObject, eventdata, handles)
% hObject
handle to Blurring (see GCBO)
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 172
% eventdata
% handles
called
reserved - to be defined in a future version of MATLAB
empty - handles not created until after all CreateFcns
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on button press in Sequence.
function Sequence_Callback(hObject, eventdata, handles)
% hObject
handle to Sequence (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles
structure with handles and user data (see GUIDATA)
d=get(handles.Distortion);
b=get(handles.Blurring);
[mov
movx]=create_seq(handles.filename,uint8(handles.nframes),'test1',d.Value,
(b.Value)/10000)
handles.mov=mov;
handles.movx=movx;
guidata(hObject,handles);
%% Function for simulating Distortion%%
%%===================================%%
function res=simulateblur2(I,n)
% Warping algortihm that simulates heat shimmer
[r c]=size(I);
%% Create shift matrix and indices matrix
%morph has same dimensions as I to map each pixel
morph=n*imresize((rand(5,5,2)-0.5),size(I),'bilinear');
morph1=morph(:,:,1);
morph2=morph(:,:,2);
tempx=1:c;
tempy=(1:r)';
% Generate matrix of indices
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 173
indicex=zeros(r,c);
indicey=zeros(r,c);
for k=1:r
indicex(k,:)=tempx;
end
for k=1:c
indicey(:,k)=tempy;
end
%% Intermediate matrix
interx=indicex-morph1;
intery=indicey-morph2;
% remove all values less than 1 and greater then width and height
[r1 c1]=find((interx<1) | (interx>c));
[r2 c2]=find((intery<1) | (intery>r));
for k=1:size(r1)
for j=1:size(c1)
if (interx(r1(k),c1(j))<1)
interx(r1(k),c1(j))=1;
elseif (interx(r1(k),c1(j))>c)
interx(r1(k),c1(j))=c;
end
end
end
for k=1:size(r2)
for j=1:size(c2)
if (intery(r2(k),c2(j))<1)
intery(r2(k),c2(j))=1;
elseif (intery(r2(k),c2(j))>r)
intery(r2(k),c2(j))=r;
end
end
end
%% Weights
x1 = floor(interx);
x2 = ceil(interx);
fx1 = (x2-interx);
fx2 = 1-fx1;
y1 = floor(intery);
y2 = ceil(intery);
fy1 = y2-intery;
fy2 = 1-fy1;
%compute the new grayvalue of the current pixel
I=double(I);
for k=1:r
for j=1:c
res(k,j) = fx1(k,j)*fy1(k,j)*I(y1(k,j),x1(k,j)) +
fy1(k,j)*fx2(k,j)*I(y1(k,j),x2(k,j)) +
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 174
fy2(k,j)*fx1(k,j)*I(y2(k,j),x1(k,j)) +
fy2(k,j)*fx2(k,j)*I(y2(k,j),x2(k,j));
end
end
%% Function for simulating Blurring%%
%%=================================%%
function i1final=func_blur(i1,k)
i1=double(i1);
[r c]=size(i1);
% Pre-prcessing of image
% Centres the image frequency transform
for x=1:r
for y=1:c
i1(x,y)=i1(x,y)*((-1)^(x+y));
end
end
% Calculate DFT
i1freq=fft2(i1);
% Calculate the OTF for the blur
% "u-r/2" and "v-c/2" are used to centre the transform
H=zeros(r,c);
for u=1:r
for v=1:c
H(u,v)=exp(-k*((u-r/2)^2+(v-c/2)^2)^(5/6));
end
end
% Calculate filtered image
filt=zeros(r,c);
for u=1:r
for v=1:c
filt(u,v)=i1freq(u,v).*H(u,v);
end
end
% Calculate inverse DFT
i1blur=ifft2(filt);
i1blur=real(i1blur);
% Post-processing of image
% Multiply by (-1) to "de-centre" the transform
i1final=zeros(r,c);
for x=1:r
for y=1:c
i1final(x,y)=i1blur(x,y)*((-1)^(x+y));
end
end
%% Function for creating a sequence from a single image%%
%%====================================================%%
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 175
function [mov movx]=create_seq(name,size,outname,n,lambda)
%
% % function create_seq(name,size,outname,n,lambda)
%
% % Creates a test sequence using a single image
% % name - name of the test image
% % size - number of frames in output sequence
% % outname - name of output sequence
% % n - distortion level
% % lambda - blurring level
image=imread(name);
lambda1=lambda;
for k=1:size
w(:,:,k)=simulateblur2(image,n);
w(:,:,k)=func_blur(w(:,:,k),lambda);
%lambda=lambda+0.0002;
lambda=(rand+0.5)*lambda1;
map=gray(256);
mov(k) = im2frame(w(:,:,k),map);
movx(k)=mov(k);
movx(k).cdata=flipud(movx(k).cdata);
end
function Frames_Callback(hObject, eventdata, handles)
% hObject
handle to Frames (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 Frames as text
%
str2double(get(hObject,'String')) returns contents of Frames as
a double
nframes=str2double(get(hObject,'String'));
handles.nframes=nframes;
guidata(hObject,handles);
% --- Executes during object creation, after setting all properties.
function Frames_CreateFcn(hObject, eventdata, handles)
% hObject
handle to Frames (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 && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 176
function edit6_Callback(hObject, eventdata, handles)
% hObject
handle to edit6 (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 edit6 as text
%
str2double(get(hObject,'String')) returns contents of edit6 as a
double
% --- Executes during object creation, after setting all properties.
function edit6_CreateFcn(hObject, eventdata, handles)
% hObject
handle to edit6 (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 && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 177
APPENDIX H
GENERAL ALGORITHM C CODE
#include
#include
#include
#include
#include
#include
<stdlib.h>
<stdio.h>
<math.h>
<cv.h>
<highgui.h>
<time.h>
/* Time-averaged general algorithm using Lucas-Kanade optical flow
algorithm. */
time_t t1,t2;
double diff=0;
IplImage *image , *grey , *prev_grey , *swap_temp, *average;
IplImage *corrected = 0;IplImage *img2 = 0;IplImage *vel_x=0, *vel_y=0;
float average2[1024][1024];
int main( int argc, char** argv )
{
CvCapture* capture = 0;
if( argc == 2 )
capture = cvCaptureFromAVI( argv[1] );
cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,0);
double x=cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
printf("Frame Rate: %f ",x);
if( !capture )
{
fprintf(stderr,"%d Could not initialize capturing...\n",argc);
return -1;
}
printf( "\n"
"\tESC - quit the program\n");
cvNamedWindow( "distorted", 1 );
cvNamedWindow( "corrected", 1 );
//==================Calculate the Reference Image===============//
time(&t1);
for(int r=0;r<10;r++)
{
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 178
IplImage* frame = 0;
frame = cvQueryFrame( capture );
if( !frame )
break;
if( !average )
{
/* allocate all the buffers */
average = cvCreateImage( cvGetSize(frame), 8, 3 );
average->origin = frame->origin;
grey = cvCreateImage( cvGetSize(frame), 8, 1 );
img2 = cvCreateImage( cvGetSize(frame), 8, 1 );
}
cvCopy( frame, average, 0 );
cvConvertImage( average, average, CV_CVTIMG_FLIP );
cvCvtColor( average, grey, CV_BGR2GRAY );
int i=0,j=0;
for(i=0;i<grey->height;i++)
{
for(j=0;j<grey->width;j++)
{
average2[i][j]=(unsigned char)(grey>imageData[i*grey->widthStep+j])+average2[i][j];
if(r==9)
{
average2[i][j]=average2[i][j]/10;
img2->imageData[i*grey->widthStep+j]=(unsigned
char)(average2[i][j]);
}
}
}
}
cvReleaseImage(&grey);
cvReleaseImage(&average);
cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,0);
//======Calculate the optical flow and remap pixels==================//
for(;;)
{
IplImage* frame = 0;
int i=0, k=0, c=0;
frame = cvQueryFrame( capture );
if( !frame )
break;
if( !image )
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 179
{
/* allocate all the buffers */
image = cvCreateImage( cvGetSize(frame), 8, 3 );
image->origin = frame->origin;
grey = cvCreateImage( cvGetSize(frame), 8, 1 );
prev_grey = cvCreateImage( cvGetSize(frame), 8, 1 );
vel_x = cvCreateImage( cvGetSize(grey),32 , 1 );
vel_y = cvCreateImage( cvGetSize(grey),32 , 1 );
corrected = cvCreateImage( cvGetSize(grey),8 , 1 );
}
cvCopy( frame, image, 0 );
cvConvertImage( image, image, CV_CVTIMG_FLIP );
cvCvtColor( image, grey, CV_BGR2GRAY );
//==========================================================//
int j=0;
int height,width,step,channels;
float *data_x1,*data_y1;
cvCalcOpticalFlowLK( grey,img2,cvSize(5,5),vel_x,vel_y);
height
width
step
channels
data_x1
data_y1
=
=
=
=
grey->height;
grey->width;
grey->widthStep;
grey->nChannels;
= (float *)vel_x->imageData;
= (float *)vel_y->imageData;
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
data_x1[i*step+j]=j-data_x1[i*step+j];
data_y1[i*step+j]=i-data_y1[i*step+j];
if (data_x1[i*step+j]<0)
data_x1[i*step+j]=0;
if (data_y1[i*step+j]<0)
data_y1[i*step+j]=0;
if (data_x1[i*step+j]>(width-2))
data_x1[i*step+j]=(float)(width-2);
if (data_y1[i*step+j]>(height-2))
data_y1[i*step+j]=(float)(height-2);
}
}
cvRemap(grey,corrected,vel_x,vel_y);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 180
//================Play Sequences====================//
cvShowImage( "distorted",grey);
cvShowImage( "corrected",corrected);
c = cvWaitKey(1);
if( (char)c == 27 )
break;
}
time(&t2);
diff=difftime(t2,t1);
printf("%f",diff);
cvReleaseCapture( &capture );
cvDestroyWindow("distorted");
cvDestroyWindow("corrected");
return 0;
}
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 181
APPENDIX I
CGI ALGORITHM C CODE
#include
#include
#include
#include
#include
#include
#include
<stdlib.h>
<stdio.h>
<math.h>
<cv.h>
<highgui.h>
<ctime>
<time.h>
time_t t1,t2;
double diff=0;
IplImage *image , *grey;
IplImage *corrected = 0;IplImage *img2 = 0;IplImage *vel_x=0, *vel_y=0;
IplImage *curr = 0, *current = 0;
float data_xf[256][256],data_yf[256][256];
float average2[256][256];
int main( int argc, char** argv )
{
CvCapture* capture = 0;
if( argc == 2 )
capture = cvCaptureFromAVI( argv[1] );
cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,0);
double x=cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
printf("Frame Rate: %f ",x);
if( !capture )
{
fprintf(stderr,"%d Could not initialize capturing...\n",argc);
return -1;
}
printf( "Hot keys: \n"
"\tESC - quit the program\n");
cvNamedWindow( "distorted", 1 );
cvNamedWindow( "corrected", 1 );
//===========Main LOOP===================//
time(&t1);
for (int q=0;q<1000;q++)
{
cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,q+5);
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 182
IplImage* frame = 0;
for(int p=0;p<1;p++)
{
frame = cvQueryFrame( capture );
if( !frame )
break;
if( !curr )
{
/* allocate all the buffers */
curr = cvCreateImage( cvGetSize(frame), 8, 3 );
curr->origin = frame->origin;
current = cvCreateImage( cvGetSize(frame), 8, 1 );
}
cvCopy( frame, curr, 0 );
cvConvertImage( curr, curr, CV_CVTIMG_FLIP );
cvCvtColor( curr, current, CV_BGR2GRAY );
}
cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES,q);
//=================Create Time window=====================//
for(p=0;p<11;p++)
{
IplImage* frame = 0;
int i=0, k=0, c=0;
frame = cvQueryFrame( capture );
if( !frame )
break;
if( !image )
{
/* allocate all the buffers */
image = cvCreateImage( cvGetSize(frame), 8, 3 );
image->origin = frame->origin;
grey = cvCreateImage( cvGetSize(frame), 8, 1 );
vel_x = cvCreateImage( cvGetSize(grey),32 , 1 );
vel_y = cvCreateImage( cvGetSize(grey),32 , 1 );
corrected = cvCreateImage( cvGetSize(grey),8 , 1 );
img2 = cvCreateImage( cvGetSize(frame), 8, 1 );
}
cvCopy( frame, image, 0 );
cvConvertImage( image, image, CV_CVTIMG_FLIP );
cvCvtColor( image, grey, CV_BGR2GRAY );
//==================Calc Optical Flow===============//
int j=0,r=0;
int height,width,step;
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 183
float *data_x1,*data_y1;
cvCalcOpticalFlowLK( current,grey,cvSize(5,5),vel_x,vel_y);
// Lk algorithm used since it is optimized
height
width
step
data_x1
data_y1
=
=
=
=
grey->height;
grey->width;
grey->widthStep;
(float *)vel_x->imageData;
= (float *)vel_y->imageData;
for(i=0;i<height;i++)
{
for(j=0;j<width;j++)
{
data_xf[i][j]=data_xf[i][j]+data_x1[i*step+j];
data_yf[i][j]=data_yf[i][j]+data_y1[i*step+j];
if (p==10)
{
data_xf[i][j]=data_xf[i][j]/10;
data_yf[i][j]=data_yf[i][j]/10;
data_x1[i*step+j]=j-data_xf[i][j];
data_y1[i*step+j]=i-data_yf[i][j];
if (data_x1[i*step+j]<0)
data_x1[i*step+j]=0;
if (data_y1[i*step+j]<0)
data_y1[i*step+j]=0;
if (data_x1[i*step+j]>(width-2))
data_x1[i*step+j]=(float)(width-2);
if (data_y1[i*step+j]>(height-2))
data_y1[i*step+j]=(float)(height-2);
}
}
}
if (p==10)
{
cvRemap(current,corrected,vel_x,vel_y);
cvShowImage( "distorted",grey);
cvShowImage( "corrected",corrected);
c = cvWaitKey(1);
if( (char)c == 27 )
break;
}
//=================Run Sequence==========================//
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 184
}
}
time(&t2);
diff=difftime(t2,t1);
printf("%f",diff);
cvReleaseCapture( &capture );
cvDestroyWindow("distorted");
cvDestroyWindow("corrected");
return 0;
}
F’SATIE – TSHWANE UNIVERSITY OF TECHNOLOGY
Page 185