comparison pymctf.py @ 3:0e5a584fd6b2

add apply_mc()
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Tue, 18 Dec 2007 10:04:01 +0100
parents f22cbbbb6814
children 4fc1d403ad14
comparison
equal deleted inserted replaced
2:f22cbbbb6814 3:0e5a584fd6b2
16 16
17 # temporal low-pass frame position 17 # temporal low-pass frame position
18 LEFT = -1 18 LEFT = -1
19 MIDDLE = 0 19 MIDDLE = 0
20 RIGHT = 1 20 RIGHT = 1
21
22 def apply_mc(a, mvf=None, bs=8):
23 mc_a = numpy.empty(a.shape, numpy.float)
24 for r in xrange(0, a.shape[0], bs):
25 for c in xrange(0, a.shape[1], bs):
26 mv = mvf[r,c]
27 rm, cm = r+mv[0],c+mv[1]
28 mc_a[r:r+bs,c:c+bs] = a[rm:rm+bs,cm:cm+bs]
29 return mc_a
30
31 def apply_mc_all(w, mvfs, bs=8, tlp=MIDDLE):
32 ws_in = [w]
33
34 take = 1
35 while take <= len(mvfs):
36 ws_out = []
37
38 if tlp == RIGHT: left = 0; mid = take; right = 0
39 elif tlp == LEFT: left = 0; mid = 0; right = take
40 else: left = 0; mid = max(take/2, 1); right = take
41
42 for i in xrange(left, mid):
43 ws_out.append(apply_mc(ws_in[i], mvfs[i], bs))
44 ws_out.append(ws_in[i])
45 for i in xrange(mid, right):
46 ws_out.append(ws_in[i])
47 ws_out.append(apply_mc(ws_in[i], mvfs[i]))
48
49 ws_in = ws_out
50 del mvfs[:take]
51
52 take *= 2
53
54 return ws_in
21 55
22 def me(a, refblock, rc, cc, sr): 56 def me(a, refblock, rc, cc, sr):
23 min_sad = sys.maxint 57 min_sad = sys.maxint
24 min_r, min_c = 0, 0 58 min_r, min_c = 0, 0
25 bs = refblock.shape[0] 59 bs = refblock.shape[0]
229 numpy.place(blockimvf[:,:,1], unconnected, -mvf[r,c,1]) 263 numpy.place(blockimvf[:,:,1], unconnected, -mvf[r,c,1])
230 numpy.place(blockimvf[:,:,2], unconnected, CONNECTED) 264 numpy.place(blockimvf[:,:,2], unconnected, CONNECTED)
231 265
232 return mvf, imvf 266 return mvf, imvf
233 267
234 def decompose_sequence(seq, Hs=[], MVFs=[], bs=8, sr=8, hlevel=2, tlp=MIDDLE, visualize_mvf=False, dlevel=-1): 268 def decompose_sequence(seq, Hs=[], MVFs=[], bs=8, sr=8, hlevel=2, tlp=MIDDLE):
235 ''' 269 '''
236 Recursively decompose frame sequence using motion-compensated temporal filtering 270 Recursively decompose frame sequence using motion-compensated temporal filtering
237 employing the parameters blocksize, searchrange and hierarchy level for motion estimation. 271 employing the parameters blocksize, searchrange and hierarchy level for motion estimation.
238 272
239 Output is [L], [H0, H1, H1, H2, H2, H2, H2], [MVF0, MVF1, MVF1, MVF2, MVF2, MVF2, MVF2] for 273 Output is [L], [H0, H1, H1, H2, H2, H2, H2], [MVF0, MVF1, MVF1, MVF2, MVF2, MVF2, MVF2] for
241 275
242 The tlp argument allows to move the temporal low-pass frame to the left, 276 The tlp argument allows to move the temporal low-pass frame to the left,
243 middle or right. 277 middle or right.
244 ''' 278 '''
245 Ls = [] 279 Ls = []
246 if dlevel < 0: dlevel = int(math.log(len(seq), 2))
247 280
248 if len(seq) == 1: 281 if len(seq) == 1:
249 return seq, Hs, MVFs 282 return seq, Hs, MVFs
250 283
251 if tlp == RIGHT: left = 0; mid = len(seq); right = 0 284 if tlp == RIGHT: left = 0; mid = len(seq); right = 0
253 else: left = 0; mid = max(len(seq)/2, 2); right = len(seq) 286 else: left = 0; mid = max(len(seq)/2, 2); right = len(seq)
254 287
255 for i in xrange(left, mid, 2): 288 for i in xrange(left, mid, 2):
256 sad, mvf = motion_estimation(seq[i+1], seq[i], bs, sr, hlevel) 289 sad, mvf = motion_estimation(seq[i+1], seq[i], bs, sr, hlevel)
257 mvf, imvf = inverse_mvf(mvf, bs) 290 mvf, imvf = inverse_mvf(mvf, bs)
258 if visualize_mvf:
259 show_mvf(mvf, imvf, i, dlevel-1, bs, sr)
260 MVFs.insert(i//2, mvf) 291 MVFs.insert(i//2, mvf)
261 L, H = ft_mvf(seq[i], seq[i+1], mvf, imvf, bs) 292 L, H = ft_mvf(seq[i], seq[i+1], mvf, imvf, bs)
262 Ls.append(L) 293 Ls.append(L)
263 Hs.insert(i//2, H) 294 Hs.insert(i//2, H)
264 295
265 for i in xrange(mid, right, 2): 296 for i in xrange(mid, right, 2):
266 sad, mvf = motion_estimation(seq[i], seq[i+1], bs, sr, hlevel) 297 sad, mvf = motion_estimation(seq[i], seq[i+1], bs, sr, hlevel)
267 mvf, imvf = inverse_mvf(mvf, bs) 298 mvf, imvf = inverse_mvf(mvf, bs)
268 if visualize_mvf:
269 show_mvf(mvf, imvf, i, dlevel-1, bs, sr)
270 MVFs.insert(i//2, mvf) 299 MVFs.insert(i//2, mvf)
271 L, H = ft_mvf(seq[i+1], seq[i], mvf, imvf, bs) 300 L, H = ft_mvf(seq[i+1], seq[i], mvf, imvf, bs)
272 Ls.append(L) 301 Ls.append(L)
273 Hs.insert(i//2, H) 302 Hs.insert(i//2, H)
274 303
275 return decompose_sequence(Ls, Hs, MVFs, bs, sr, hlevel, tlp, visualize_mvf, dlevel-1) 304 return decompose_sequence(Ls, Hs, MVFs, bs, sr, hlevel, tlp)
305
306 def decompose_sequence_using_mvf(seq, Hs=[], 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:
320 return seq, Hs
321
322 if tlp == RIGHT: left = 0; mid = len(seq); right = 0
323 elif tlp == LEFT: left = 0; mid = 0; right = len(seq)
324 else: left = 0; mid = max(len(seq)/2, 2); right = len(seq)
325
326 for i in xrange(left, mid, 2):
327 mvf = MVFs[(-len(seq)+i)/2]
328 mvf, imvf = inverse_mvf(mvf, bs)
329 L, H = ft_mvf(seq[i], seq[i+1], mvf, imvf, bs)
330 Ls.append(L)
331 Hs.insert(i//2, H)
332
333 for i in xrange(mid, right, 2):
334 mvf = MVFs[(-len(seq)+i)/2 ]
335 mvf, imvf = inverse_mvf(mvf, bs)
336 L, H = ft_mvf(seq[i+1], seq[i], mvf, imvf, bs)
337 Ls.append(L)
338 Hs.insert(i//2, H)
339
340 del MVFs[-len(seq)/2:]
341
342 return decompose_sequence_using_mvf(Ls, Hs, MVFs, bs, tlp)
343
276 344
277 def reconstruct_sequence(seq, Hs, MVFs, bs=8, tlp=MIDDLE): 345 def reconstruct_sequence(seq, Hs, MVFs, bs=8, tlp=MIDDLE):
278 ''' 346 '''
279 Recursively reconstruct a frame sequence from temporal low- and high-pass subbands 347 Recursively reconstruct a frame sequence from temporal low- and high-pass subbands
280 and motion fields. 348 and motion fields.

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.