Guest User

OF

a guest
Jan 14th, 2013
3,485
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.52 KB | None | 0 0
  1. from math import sqrt
  2.  
  3. import numpy
  4.  
  5. def I(pixel, opt=0):
  6.     R, G, B = pixel
  7.     return (0.2126 * R) + (0.7152 * G) + (0.0722 * B)
  8.  
  9.  
  10. def image_to_intensity(image, opt=0):
  11.     pix = image.load()
  12.     return [[I(pix[y, x]) for y in range(image.size[0])] for x in range(image.size[1])]
  13.  
  14.  
  15. def lucas_kanade(im1, im2, win=2):
  16.     width = len(im1[0])
  17.     height = len(im1)
  18.  
  19.     assert len(im1[0]) == len(im2[0])
  20.     assert len(im1) == len(im2)
  21.  
  22.     opfl = [[(0.0, 0.0)] * width for x in range(height)]
  23.  
  24.     for y in range(win + 1, height - win - 1):
  25.         for x in range(win + 1, width - win - 1):
  26.             neighbours = [(Y, X) for X in range(x - win, x + win + 1) for Y in range(y - win, y + win + 1)]
  27.  
  28.             A = numpy.matrix([[
  29.                 (im1[p[0]][p[1] + 1] - im1[p[0]][p[1] - 1]) / 2,
  30.                 (im1[p[0] + 1][p[1]] - im1[p[0] - 1][p[1]]) / 2
  31.                 ] for p in neighbours
  32.             ])
  33.  
  34.             b = numpy.matrix([[
  35.                 im1[p[0]][p[1]] - im2[p[0]][p[1]]
  36.                 ] for p in neighbours
  37.             ])
  38.  
  39.             try:
  40.                 v = numpy.linalg.solve(numpy.transpose(A) * A, numpy.transpose(A) * b)
  41.             except(Exception):
  42.                 v = [[0], [0]]
  43.             opfl[y][x] = (v[0][0], v[1][0])
  44.  
  45.     return opfl
  46.  
  47.  
  48. import gc
  49. import Image
  50. from OpticalFlows import image_to_intensity
  51. from OpticalFlows import lucas_kanade
  52. from sys import argv as arg
  53.  
  54.  
  55. for i in range(int(arg[1]), int(arg[2])):
  56.     n1 = 'frame%04d.jpg' % i
  57.     n2 = 'frame%04d.jpg' % (i + 1)
  58.  
  59.     print 'Computing Optical Flow between {0} and {1}'.format(n1, n2)
  60.  
  61.     im1 = Image.open(n1)
  62.     im2 = Image.open(n2)
  63.  
  64.     i1 = image_to_intensity(im1)
  65.     i2 = image_to_intensity(im2)
  66.  
  67.     win = 2
  68.  
  69.     opfl = lucas_kanade(i1, i2, win)
  70.  
  71.     # check GC, suprisingly values returned after each iteration are exactly the same, or less than 1% different
  72.     print len(gc.get_objects())
  73.     gc.collect()
  74.     print len(gc.get_objects())
  75.  
  76.     # prepare iblack-red image, presenting the optical flow and blend it with original one
  77.     normal = 255.0 / ((2*win+1)*2**(0.5))
  78.  
  79.     width, height = im1.size
  80.  
  81.     out = Image.new("RGB", (width,height))
  82.     pix = out.load()
  83.     for y in range(height):
  84.       for x in range(width):
  85.         pix[x,y] = (min(255,int(normal*sqrt(abs(opfl[y][x][0])*abs(opfl[y][x][0]) + abs(opfl[y][x][1])*abs(opfl[y][x][1])))),0,0)
  86.  
  87.     out.save('a'+n2)
  88.     i3 = Image.blend(im2, out, 0.5)
  89.     i3 = i3.point(lambda i: i * 2)
  90.     i3.save('b'+n2)
Advertisement
Add Comment
Please, Sign In to add comment