Mercurial > hg > pymctf
comparison pymctf.py @ 5:b235e08ebd04
cleaner recursion, eliminate parameters
| author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> | 
|---|---|
| date | Tue, 18 Dec 2007 15:16:56 +0100 | 
| parents | 4fc1d403ad14 | 
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| 4:4fc1d403ad14 | 5:b235e08ebd04 | 
|---|---|
| 263 numpy.place(blockimvf[:,:,1], unconnected, -mvf[r,c,1]) | 263 numpy.place(blockimvf[:,:,1], unconnected, -mvf[r,c,1]) | 
| 264 numpy.place(blockimvf[:,:,2], unconnected, CONNECTED) | 264 numpy.place(blockimvf[:,:,2], unconnected, CONNECTED) | 
| 265 | 265 | 
| 266 return mvf, imvf | 266 return mvf, imvf | 
| 267 | 267 | 
| 268 def decompose_sequence(seq, Hs=[], MVFs=[], bs=8, sr=8, hlevel=2, tlp=MIDDLE): | 268 def decompose(seq, bs=8, sr=8, hlevel=2, tlp=MIDDLE): | 
| 269 ''' | |
| 270 Recursively decompose frame sequence using motion-compensated temporal filtering | |
| 271 employing the parameters blocksize, searchrange and hierarchy level for motion estimation. | |
| 272 | |
| 273 Output is [L], [H0, H1, H1, H2, H2, H2, H2], [MVF0, MVF1, MVF1, MVF2, MVF2, MVF2, MVF2] for | |
| 274 a sequence of length 8. | |
| 275 | |
| 276 The tlp argument allows to move the temporal low-pass frame to the left, | |
| 277 middle or right. | |
| 278 ''' | |
| 279 Ls = [] | |
| 280 | |
| 281 if len(seq) == 1: | 269 if len(seq) == 1: | 
| 282 return seq, Hs, MVFs | 270 return seq, [], [] | 
| 283 | 271 | 
| 284 if tlp == RIGHT: left = 0; mid = len(seq); right = 0 | 272 if tlp == RIGHT: left = 0; mid = len(seq); right = 0 | 
| 285 elif tlp == LEFT: left = 0; mid = 0; right = len(seq) | 273 elif tlp == LEFT: left = 0; mid = 0; right = len(seq) | 
| 286 else: left = 0; mid = max(len(seq)/2, 2); right = len(seq) | 274 else: left = 0; mid = max(len(seq)/2, 2); right = len(seq) | 
| 287 | 275 | 
| 276 MVFs = []; Ls = []; Hs = [] | |
| 288 for i in xrange(left, mid, 2): | 277 for i in xrange(left, mid, 2): | 
| 289 sad, mvf = motion_estimation(seq[i+1], seq[i], bs, sr, hlevel) | 278 sad, mvf = motion_estimation(seq[i+1], seq[i], bs, sr, hlevel) | 
| 290 mvf, imvf = inverse_mvf(mvf, bs) | 279 mvf, imvf = inverse_mvf(mvf, bs) | 
| 291 MVFs.insert(i//2, mvf) | 280 MVFs += [mvf] | 
| 292 L, H = ft_mvf(seq[i], seq[i+1], mvf, imvf, bs) | 281 L, H = ft_mvf(seq[i], seq[i+1], mvf, imvf, bs) | 
| 293 Ls.append(L) | 282 Ls += [L] | 
| 294 Hs.insert(i//2, H) | 283 Hs += [H] | 
| 295 | 284 | 
| 296 for i in xrange(mid, right, 2): | 285 for i in xrange(mid, right, 2): | 
| 297 sad, mvf = motion_estimation(seq[i], seq[i+1], bs, sr, hlevel) | 286 sad, mvf = motion_estimation(seq[i], seq[i+1], bs, sr, hlevel) | 
| 298 mvf, imvf = inverse_mvf(mvf, bs) | 287 mvf, imvf = inverse_mvf(mvf, bs) | 
| 299 MVFs.insert(i//2, mvf) | 288 MVFs += [mvf] | 
| 300 L, H = ft_mvf(seq[i+1], seq[i], mvf, imvf, bs) | 289 L, H = ft_mvf(seq[i+1], seq[i], mvf, imvf, bs) | 
| 301 Ls.append(L) | 290 Ls += [L] | 
| 302 Hs.insert(i//2, H) | 291 Hs += [H] | 
| 303 | 292 | 
| 304 return decompose_sequence(Ls, Hs, MVFs, bs, sr, hlevel, tlp) | 293 return Ls, Hs, MVFs | 
| 305 | 294 | 
| 306 def decompose_sequence_using_mvf(seq, Hs=[], MVFs=[], bs=8, tlp=MIDDLE): | 295 def decompose_using_mvf(seq, MVFs, bs=8, tlp=MIDDLE): | 
| 307 ''' | |
| 308 Recursively decompose frame sequence using motion-compensated temporal filtering | |
| 309 employing the given motion vector field. | |
| 310 | |
| 311 Output is [L], [H0, H1, H1, H2, H2, H2, H2] for | |
| 312 a sequence of length 8. | |
| 313 | |
| 314 The tlp argument allows to move the temporal low-pass frame to the left, | |
| 315 middle or right. | |
| 316 ''' | |
| 317 Ls = [] | |
| 318 | |
| 319 if len(seq) == 1: | 296 if len(seq) == 1: | 
| 320 return seq, Hs | 297 return seq, [] | 
| 321 | 298 | 
| 322 if tlp == RIGHT: left = 0; mid = len(seq); right = 0 | 299 if tlp == RIGHT: left = 0; mid = len(seq); right = 0 | 
| 323 elif tlp == LEFT: left = 0; mid = 0; right = len(seq) | 300 elif tlp == LEFT: left = 0; mid = 0; right = len(seq) | 
| 324 else: left = 0; mid = max(len(seq)/2, 2); right = len(seq) | 301 else: left = 0; mid = max(len(seq)/2, 2); right = len(seq) | 
| 325 | 302 | 
| 303 Ls = []; Hs = [] | |
| 326 for i in xrange(left, mid, 2): | 304 for i in xrange(left, mid, 2): | 
| 327 mvf = MVFs[(-len(seq)+i)/2] | 305 mvf = MVFs[i//2] | 
| 328 mvf, imvf = inverse_mvf(mvf, bs) | 306 mvf, imvf = inverse_mvf(mvf, bs) | 
| 329 L, H = ft_mvf(seq[i], seq[i+1], mvf, imvf, bs) | 307 L, H = ft_mvf(seq[i], seq[i+1], mvf, imvf, bs) | 
| 330 Ls.append(L) | 308 Ls += [L] | 
| 331 Hs.insert(i//2, H) | 309 Hs += [H] | 
| 332 | 310 | 
| 333 for i in xrange(mid, right, 2): | 311 for i in xrange(mid, right, 2): | 
| 334 mvf = MVFs[(-len(seq)+i)/2 ] | 312 mvf = MVFs[i//2] | 
| 335 mvf, imvf = inverse_mvf(mvf, bs) | 313 mvf, imvf = inverse_mvf(mvf, bs) | 
| 336 L, H = ft_mvf(seq[i+1], seq[i], mvf, imvf, bs) | 314 L, H = ft_mvf(seq[i+1], seq[i], mvf, imvf, bs) | 
| 337 Ls.append(L) | 315 Ls += [L] | 
| 338 Hs.insert(i//2, H) | 316 Hs += [H] | 
| 339 | 317 | 
| 318 return Ls, Hs | |
| 319 | |
| 320 def decompose_sequence(seq, bs=8, sr=8, hlevel=2, tlp=MIDDLE): | |
| 321 ''' | |
| 322 Recursively decompose frame sequence using motion-compensated temporal filtering | |
| 323 employing the parameters blocksize, searchrange and hierarchy level for motion estimation. | |
| 324 | |
| 325 Output is [L], [H0, H1, H1, H2, H2, H2, H2], [MVF0, MVF1, MVF1, MVF2, MVF2, MVF2, MVF2] for | |
| 326 a sequence of length 8. | |
| 327 | |
| 328 The tlp argument allows to move the temporal low-pass frame to the left, | |
| 329 middle or right. | |
| 330 ''' | |
| 331 | |
| 332 Ls, Hs, MVFs = decompose(seq, bs, sr, hlevel, tlp) | |
| 333 | |
| 334 while len(Ls) > 1: | |
| 335 Ls, hs, mvfs = decompose(Ls, bs, sr, hlevel, tlp) | |
| 336 Hs = hs + Hs; MVFs = mvfs + MVFs | |
| 337 | |
| 338 return Ls, Hs, MVFs | |
| 339 | |
| 340 | |
| 341 def decompose_sequence_using_mvf(seq, MVFs, bs=8, tlp=MIDDLE): | |
| 342 ''' | |
| 343 Recursively decompose frame sequence using motion-compensated temporal filtering | |
| 344 employing the given motion vector field. | |
| 345 | |
| 346 Output is [L], [H0, H1, H1, H2, H2, H2, H2] for | |
| 347 a sequence of length 8. | |
| 348 | |
| 349 The tlp argument allows to move the temporal low-pass frame to the left, | |
| 350 middle or right. | |
| 351 ''' | |
| 352 | |
| 353 Ls, Hs = decompose_using_mvf(seq, MVFs[-len(seq)/2:], bs, tlp) | |
| 340 del MVFs[-len(seq)/2:] | 354 del MVFs[-len(seq)/2:] | 
| 341 | 355 | 
| 342 return decompose_sequence_using_mvf(Ls, Hs, MVFs, bs, tlp) | 356 while len(Ls) > 1: | 
| 343 | 357 Ls, hs = decompose_using_mvf(Ls, MVFs[-len(Ls)/2:], bs, tlp) | 
| 344 | 358 del MVFs[-len(Ls):] | 
| 345 def reconstruct_sequence(seq, Hs, MVFs, bs=8, tlp=MIDDLE): | 359 Hs = hs + Hs | 
| 346 ''' | 360 | 
| 347 Recursively reconstruct a frame sequence from temporal low- and high-pass subbands | 361 return Ls, Hs | 
| 348 and motion fields. | 362 | 
| 349 ''' | 363 def reconstruct(seq, Hs, MVFs, bs=8, tlp=MIDDLE): | 
| 350 | |
| 351 Ls = [] | |
| 352 | 364 | 
| 353 if len(Hs) == 0: | 365 if len(Hs) == 0: | 
| 354 return seq | 366 return seq | 
| 355 | 367 | 
| 356 if tlp == RIGHT: left = 0; mid = len(seq); right = 0 | 368 if tlp == RIGHT: left = 0; mid = len(seq); right = 0 | 
| 357 elif tlp == LEFT: left = 0; mid = 0; right = len(seq) | 369 elif tlp == LEFT: left = 0; mid = 0; right = len(seq) | 
| 358 else: left = 0; mid = max(len(seq)/2, 1); right = len(seq) | 370 else: left = 0; mid = max(len(seq)/2, 1); right = len(seq) | 
| 359 | 371 | 
| 372 Ls = [] | |
| 360 for i in xrange(0, mid): | 373 for i in xrange(0, mid): | 
| 361 mvf = MVFs[0] | 374 mvf = MVFs[0] | 
| 362 mvf, imvf = inverse_mvf(mvf, bs) | 375 mvf, imvf = inverse_mvf(mvf, bs) | 
| 363 a, b = it_mvf(seq[i], Hs[0], mvf, imvf, bs) | 376 a, b = it_mvf(seq[i], Hs[0], mvf, imvf, bs) | 
| 364 Ls += [a] + [b] | 377 Ls += [a] + [b] | 
| 371 a, b = it_mvf(seq[i], Hs[0], mvf, imvf, bs) | 384 a, b = it_mvf(seq[i], Hs[0], mvf, imvf, bs) | 
| 372 Ls += [b] + [a] | 385 Ls += [b] + [a] | 
| 373 del Hs[0] | 386 del Hs[0] | 
| 374 del MVFs[0] | 387 del MVFs[0] | 
| 375 | 388 | 
| 376 return reconstruct_sequence(Ls, Hs, MVFs, bs, tlp) | 389 return Ls | 
| 377 | 390 | 
| 391 def reconstruct_sequence(seq, Hs, MVFs, bs=8, tlp=MIDDLE): | |
| 392 ''' | |
| 393 Recursively reconstruct a frame sequence from temporal low- and high-pass subbands | |
| 394 and motion fields. | |
| 395 ''' | |
| 396 | |
| 397 while len(seq) <= len(Hs): | |
| 398 seq = reconstruct(seq, Hs, MVFs, bs, tlp) | |
| 399 return seq | |
| 400 | 
