Upload
wenzeslaus-stien
View
113
Download
0
Embed Size (px)
Citation preview
Die Bestimmung des Optical Flow aus Bildsequenzen
Busa Fekete Robert
Horvath Peter
Die Algorithmen
Was bedeutet eigentlich: Optical Flow?
• Optical Flow: Vektoren, die die Bewegungen zwischen 2 Bildsequenzen zeigen
Bestimmung maximal 1 Pixel großer Bewegungen
),(),(),(),( 111,11
min yjxiIjiIyxjim kkyx
k
1
1
1
11
1
1
1
111,11
),(),(),(),( minu v
ku v
kyx
k yvjxuiIvjuiIyxjim
Wie könnte man die Bewegungen detektieren, die größer sind als 1 Pixel
• Verkleinert man das Bild, dann werden auch die Bewegungen im Bild verkleinert, zB. ist die 2 Einheiten große Bewegung im oberen Bild im unteren Bild, das nur halb so gross ist, nur noch 1 Einheit groß.
Aufbau der Pyramide• Den vorherigen Gedankengang fortführend: wenn man
das Bild n-mal verkleinert, dann würden die 2n großen Bewegungen im n-sten Bild nur noch 1 groß sein. Also wenn wir wissen, dass es maximal n große Bewegungen gibt, dann müssen wir log2 n Stück Bilder fertigen.
Anfertigung der Pyramide 1.• Als Maske benutzen wir die normal verteilte Gauss 2D Standard
Matrix (die Summe der Einträge der Matrix ist auf 1 normalisiert). Am schnellsten funktioniert es, wenn wir 3x3 große Matrix anwenden, aber ich empfehle die Größe 5x5 oder 7x7.
0.003 0.013 0.022 0.013 0.0030.013 0.060 0.098 0.060 0.0130.022 0.098 0.162 0.098 0.0220.013 0.060 0.098 0.060 0.0130.003 0.013 0.022 0.013 0.003
xexf
x
,2
1)(
2
2
22
)(
,
Anfertigung der Pyramide 2.
• Wir koennen auf folgende Weise von einem 2n+1 x 2n+1 großen Bild eines der Größe n+1 x n+1 erzeugen.
Backwards- Strategie 1.
Vom kleineren OF der Pyramide können wir das größere so aufbauen:
• 1. Man verdoppelt die Vektoren
• 2. Die (2i, 2j), (2i+1, 2j), (2i, 2j+1), (2i+1, 2j+1)-sten Vektoren des großen OF bekommen den Wert des Doppelten der Größe des (i, j)-sten Vektors des kleinen OF.
Backwards- Strategie 2.
• 3. Verfeinerung: Suche der maximal 1 Pixel großen Bewegung. Wir haben grobe Schätzungen hinsichtlich der Bewegungen. Jetzt wird dies verfeinert mit Hilfe der früher gezeigten Methode.
Mehr als zwei Sequenzen• Wenn wir mehr als zwei Sequenzen haben, dann kann bei
der Anfertigung des n+1-sten Bildsequenzes das n-ste helfen. Wenn die Sequenzen einander zeitlich häufig folgen, werden mit großer Wahrscheinlichkeit die Vektoren der Bewegungen im n-sten Bild nur etwas abweichen von denen im n+1-sten Bild.
Homogene Gebiete
• Der Algorithmus kann in seinem gegenwärtigem Stand nicht zur Detektierung homogener Gebiete benutzt werden (zB.: rote Schnee fällt im roten Hintergrund ), in solchen Fällen erachten wir es als eine gute Lösung, wenn hierbei der Wert der Bewegung 0 ist.
• Deshalb wird die 3x3 Matrix vor der Aussiebung des Minimums mit einer N(0.0, 3.0) Standard normal verteilten Gauss Matrix multipliziert. Dies beeinflusst in derart geringem Maß die Untersuchung der nicht homogenen Gebiete, dass es in der Praxis keine Probleme bereitet, trotzdem werden die homogene Gebiete gut ausgefiltert.
• Zwecks Beseitigung der auftretenden Fehler glättet man die Vektoren zu ihrer Umgebung. Mehrere solche Methoden können angewandt werden, z.B.:
• 3x3 Maske:
• Man benutzt im gegenwärtigen Algorithmus die früher vorgestellte Gauss N(0.0, 1.5) Matrix in der Größe 5x5.
Glätten 1.
121
242
121
16
1
Glätten 2.OF ohne Erweichung:
Erweichte OF:
Paralelle Rechnungen
• Weil jede Operation nur lokale Bildinformationen benutzt, so koennen wir die Algorithme auf paralelle Rechner implementieren. Also mit Hilfe der Pixel paralelle Rechnungen kann man die Prozesse verschnellern.
Laufzeit
• Laufzeit:• Aufbau der Pyramide:
• Backwards-Strategie:
• Erweichung:
• Insgesamt:
)(...42
...42
22222
222
2 ncnabnnn
nan
an
aan
)(...42
...42
22222
222
2 ncnabnnn
nan
an
aan
)(...42
...42
22222
222
2 ncnabnnn
nan
an
aan
)()(3 22 nn
Erneuerungen
• Gauss Pyramide
• Homogene Bereiche
• Erweichung
Implementation
Das gegenwärtige System
• ANSI C++• Unter Windows entwickelt, aber nur mit
Verwendung von Standard Headers, so ist es platformunabhängig
• Es behandelt Portable Grayscale Map (.pgm 8 bit) und Portable Pixel Map (.ppm 24 bit color) Bilddaten
• Erreichbar:• http://www.stud.u-szeged.hu/Horvath.Peter.3
Class Diagramm
CGaussMatrix classCGaussMatrix::CGaussMatrix(int size, double muf, double sigmaf)
{
...
const1 = 1 / (sqrt(2*M_PI)*sigma);
for (i=0;i<size;i++){
for (j=0;j<size;j++){
tav = sqrt((-((size-1)/2)+i)*(-((size-1)/2)+i)+(-((size-1)/2)+j)*(-((size-1)/2)+j));
Elements[i][j] = const1 * exp( - ( ( (tav - mu)*(tav - mu) ) / (2*sigma*sigma) ));
}
}
i=0;
for (i=0;i<size;i++){
for (j=0;j<size;j++){
norm += Elements[i][j];
}
}
for (i=0;i<size;i++){
for (j=0;j<size;j++){
Elements[i][j] *= (1/norm);
}
}
printf("CGaussMatrix class (new Gaussmatrix %d x %d): succesfull...\n", size, size);
}
CImagePyramid ClassCImagePyramid::CImagePyramid(char *FileName, int Depth, int GaussSize){...
if (Depth > 0){for (int i = 1; i < Depth; i++){
sx = sx >> 1;sy = sy >> 1;if (sx < 1) sx = 1;if (sy < 1) sy = 1;Pyramid[i] = new CPMImage(sx, sy);
}}for(int i = 0; i < Depth-1; i++){ for (incX = 0; incX < Pyramid[i]->GetSizeX(); incX+=2){ for (incY = 0; incY < Pyramid[i]->GetSizeY(); incY+=2){ tmpr = 0.0; tmpg = 0.0; tmpb = 0.0; for (GaussX = - GaussSize / 2; GaussX < GaussSize / 2 + 1; GaussX++){ for (GaussY = - GaussSize / 2; GaussY < GaussSize / 2 + 1; GaussY++){ r += (double)(Pyramid[i]->GetPixel(incX + GaussX, incY + GaussY) & 0x0000FF) *
Gauss->GetXY(GaussX, GaussY); } } }}
}
Experimentelle Ergebnisse
Testumgebung
• Rechner:• PIII Celeron 1200Mhz CPU, 128 Mb RAM
Bildgröße Laufzeit (s)
3x3 Gauss 7x7 Gauss
256x256 15.85 17.34
512x512 61.49 70.17
Experiment 1.
• Rotation (3 Grad nach links):
Experiment 2.
• Verschiebung (x->5 pixel, y->3)
Experiment 3.
Scale (103%)
Referenzen
Referenzen
• [1] P. J. Burt and E. H. Adelson: The Laplacian Pyramid as a Compact Image Code
• [2] P. Anandan: A Comutational Framework and an Algorithm for the Measurement of Visual Motion
• [3] P. Bouthemy and E. Francois: Motion Segmentation and Qualitative Dynamic Scene Analysis from an Image Sequence
• [4] T. Lin J. L. Barron: Image Reconstruction Error for Optical Flow