Quantcast
Channel: 懒得折腾
Viewing all articles
Browse latest Browse all 764

Computational Photography Programming Assignment 4 – Video Textures

$
0
0

part0

import numpy as np
import cv2

def video_volume(image_list):
  '''Create a video volume from the image list.

  Input:
    image_list - a list of frames. Each element of the list contains a numpy
    array of a colored image. You may assume that each frame has the same shape,
    (rows, cols, 3).

  Output:
    output - a single 4d numpy array. This array should have dimensions
    (time, rows, cols, 3) and dtype np.uint8.
  '''
  output = None
  # Insert your code here ------------------------------------------------------
  (rows, cols, color) = image_list[0].shape
  output = np.zeros((len(image_list), rows, cols, color), dtype = np.uint8)
  for i in range(len(image_list)):
    output[i,:,:,:] = image_list[i]
  # ----------------------------------------------------------------------------
  return output

def ssd(video_volume):
  '''Compute the sum of squared distances for each pair of frames in video volume.
  Input:
    video_volume - as returned by your video_volume function.

  Output:
    output - a square 2d numpy array of dtype float. output[i,j] should contain 
    the dsum of square differences between frames i and j.
  '''
  output = None
  # Insert your code here ------------------------------------------------------
  (frames, rows, cols, color) = video_volume.shape
  output = np.zeros((frames, frames), dtype = np.float)
  for i in range(frames):
    image_i = video_volume[i,:,:,:]
    for j in range(frames):
      image_j = video_volume[j,:,:,:]
      total = 0.0
      diff_image = image_i - image_j
      for k1 in range(rows):
        for k2 in range(cols):
          for k3 in range(3):
            total = total + diff_image[k1,k2,k3] * diff_image[k1,k2,k3]
      output[i, j] = total
  # ----------------------------------------------------------------------------
  return output

def test():
  '''This script will perform a unit test on your function, and provide useful
  output.
  '''
  image_list1 = [np.array([[[ 0,  0,  0],
                            [ 0,  0,  0]]], dtype = np.uint8),
                 np.array([[[ 1,  1,  1],
                            [ 1,  1,  1]]], dtype = np.uint8),
                 np.array([[[ 2,  2,  2],
                            [ 2,  2,  2]]], dtype = np.uint8),
                 np.array([[[ 3,  3,  3],
                            [ 3,  3,  3]]], dtype = np.uint8)] 

  video_volume1 = np.array([[[[ 0,  0,  0],
                              [ 0,  0,  0]]],
                            [[[ 1,  1,  1],
                              [ 1,  1,  1]]],
                            [[[ 2,  2,  2],
                              [ 2,  2,  2]]],
                            [[[ 3,  3,  3],
                              [ 3,  3,  3]]]], dtype = np.uint8) 

  image_list2 =[np.array([[[2, 2, 2],
                           [2, 2, 2],
                           [2, 2, 2],
                           [2, 2, 2]],
                          [[2, 2, 2],
                           [2, 2, 2],
                           [2, 2, 2],
                           [2, 2, 2]]], dtype = np.uint8),
                np.array([[[1, 1, 1],
                           [1, 1, 1],
                           [1, 1, 1],
                           [1, 1, 1]],
                          [[1, 1, 1],
                           [1, 1, 1],
                           [1, 1, 1],
                           [1, 1, 1]]], dtype = np.uint8),
                np.array([[[0, 0, 0],
                           [0, 0, 0],
                           [0, 0, 0],
                           [0, 0, 0]],
                          [[0, 0, 0],
                           [0, 0, 0],
                           [0, 0, 0],
                           [0, 0, 0]]], dtype = np.uint8)] 

  video_volume2 = np.array([[[[2, 2, 2],
                              [2, 2, 2],
                              [2, 2, 2],
                              [2, 2, 2]],
                             [[2, 2, 2],
                              [2, 2, 2],
                              [2, 2, 2],
                              [2, 2, 2]]],
                            [[[1, 1, 1],
                              [1, 1, 1],
                              [1, 1, 1],
                              [1, 1, 1]],
                             [[1, 1, 1],
                              [1, 1, 1],
                              [1, 1, 1],
                              [1, 1, 1]]],
                            [[[0, 0, 0],
                              [0, 0, 0],
                              [0, 0, 0],
                              [0, 0, 0]],
                             [[0, 0, 0],
                              [0, 0, 0],
                              [0, 0, 0],
                              [0, 0, 0]]]], dtype = np.uint8)

  diff1 = np.array([[  0.,   6.,  24.,  54.],
                    [  6.,   0.,   6.,  24.],
                    [ 24.,   6.,   0.,   6.],
                    [ 54.,  24.,   6.,   0.]], dtype = np.float) 

  diff2 = np.array([[  0.,  24.,  96.],
                    [ 24.,   0.,  24.],
                    [ 96.,  24.,   0.]], dtype = np.float) 

  if __name__ == "__main__":
    print 'Evaluating video_volume.'
  for img_list, true_out in zip((image_list1, image_list2), (video_volume1, video_volume2)):
    if __name__ == "__main__":
      print "input:\n{}\n".format(img_list)

    usr_out = video_volume(img_list)

    if not type(usr_out) == type(true_out):
      if __name__ == "__main__":
        print "Error- video_volume has type {}. Expected type is {}.".format(
            type(usr_out), type(true_out))
      return False

    if not usr_out.shape == true_out.shape:
      if __name__ == "__main__":
        print "Error- video_volume has shape {}. Expected shape is {}.".format(
            usr_out.shape, true_out.shape)
      return False

    if not usr_out.dtype == true_out.dtype:
      if __name__ == "__main__":
        print "Error- video_volume has dtype {}. Expected dtype is {}.".format(
            usr_out.dtype, true_out.dtype)
      return False

    if not np.all(usr_out == true_out):
      if __name__ == "__main__":
        print "Error- video_volume has value:\n{}\nExpected value:\n{}".format(
            usr_out, true_out)
      return False

  if __name__ == "__main__":
    print "video_volume passed."
    print "evaluating ssd"

  for vid_volume, true_out in zip((video_volume1, video_volume2), (diff1, diff2)):
    if __name__ == "__main__":
      print "input:\n{}\n".format(vid_volume)

    usr_out = ssd(vid_volume)

    if not type(usr_out) == type(true_out):
      if __name__ == "__main__":
        print "Error- ssd has type {}. Expected type is {}.".format(
            type(usr_out), type(true_out))
      return False

    if not usr_out.shape == true_out.shape:
      if __name__ == "__main__":
        print "Error- ssd has shape {}. Expected shape is {}.".format(
            usr_out.shape, true_out.shape)
      return False

    if not usr_out.dtype == true_out.dtype:
      if __name__ == "__main__":
        print "Error- ssd has dtype {}. Expected dtype is {}.".format(
            usr_out.dtype, true_out.dtype)
      return False

    if not np.all(np.abs(usr_out - true_out) < 1.):
      if __name__ == "__main__":
        print "Error- ssd has value:\n{}\nExpected value:\n{}".format(
            usr_out, true_out)
      return False

  if __name__ == "__main__":
    print "All unit tests successful."
  return True

if __name__ == "__main__":
  print "Performing unit tests.(ssd will be accepted if the output is within 1 of the expected output.)"
  np.set_printoptions(precision=1)

  test()

part1

import numpy as np
import cv2
import scipy.signal

def binomial_filter_5():
  ''' Create a binomial filter of length 4.
  '''
  return np.array([ 0.0625,  0.25  ,  0.375 ,  0.25  ,  0.0625], dtype=float)

def diff2(diff1):
  '''Compute the transition costs between frames, taking dynamics into account.
  
  Input:
  diff1 - a difference matrix as produced by your ssd function.

  Output:
  output - a new difference matrix that takes preceding and following frames into 
           account. The cost of transitioning from i to j should weight the 
           surrounding frames according to the binomial filter provided to you 
           above. So, the difference between i and j has weight 0.375, the frames
           immediately following weight 0.25, etc...

           The output difference matrix should have the same dtype as the input,
           but be 4 rows and columns smaller, corresponding to only the frames
           that have valid dynamics.

  Hint: there is a very efficient way to do this with 2d convolution. Think about
        the coordinates you are using as you consider the preceding and following
        frame pairings.
  '''
  output = None
  # Insert your code here ------------------------------------------------------
  w_1d = binomial_filter_5()
  (w_size) = w_1d.shape
  (rows, cols) = diff1.shape
  output = np.zeros((rows - 4, cols - 4), dtype = np.float)
  for i in range(2, rows - 2, 1):
    for j in range(2, cols - 2, 1):
      total = 0.0;
      for k in range(-2, 3, 1):
          total = total + diff1[i + k, j + k]*w_1d[k + 2]
      output[i - 2, j - 2] = total
  #kernel = np.outer(w_1d, w_1d)
  #output = scipy.signal.convolve2d(diff1, kernel, 'valid')
  # ----------------------------------------------------------------------------
  return output

def test():
  '''This script will perform a unit test on your function, and provide useful
  output.
  '''
  d1 = np.zeros((9,9), dtype = float) 
  d1[4,4] = 1

  d2 = np.eye(5, dtype = float)

  out1 = np.array([[ 0.0625,  0.    ,  0.    ,  0.    ,  0.    ],
                   [ 0.    ,  0.25  ,  0.    ,  0.    ,  0.    ],
                   [ 0.    ,  0.    ,  0.375 ,  0.    ,  0.    ],
                   [ 0.    ,  0.    ,  0.    ,  0.25  ,  0.    ],
                   [ 0.    ,  0.    ,  0.    ,  0.    ,  0.0625]], dtype = float)

  out2 = np.array([[1.]], dtype = float)

  if __name__ == "__main__":
    print 'Evaluating diff2.'
  for d, true_out in zip((d1, d2), (out1, out2)):
    if __name__ == "__main__":
      print "input:\n{}\n".format(d)

    usr_out = diff2(d) 

    if not type(usr_out) == type(true_out):
      if __name__ == "__main__":
        print "Error- diff2 output has type {}. Expected type is {}.".format(
            type(usr_out), type(true_out))
      return False

    if not usr_out.shape == true_out.shape:
      if __name__ == "__main__":
        print "Error- diff2 output has shape {}. Expected shape is {}.".format(
            usr_out.shape, true_out.shape)
      return False

    if not usr_out.dtype == true_out.dtype:
      if __name__ == "__main__":
        print "Error- diff2 output has dtype {}. Expected dtype is {}.".format(
            usr_out.dtype, true_out.dtype)
      return False

    if not np.all(np.abs(usr_out - true_out) < 0.05):
      if __name__ == "__main__":
        print "Error- diff2 output has value:\n{}\nExpected value:\n{}".format(
            usr_out, true_out)
      return False

  if __name__ == "__main__":
    print "diff2 passed."

  if __name__ == "__main__":
    print "All unit tests successful."
  return True

if __name__ == "__main__":
  print "Performing unit tests. (Your output will be accepted if it is within .05 of the true output)"
  np.set_printoptions(precision=1)

  test()

part2

import numpy as np
import cv2
import sys
import scipy.signal

def find_biggest_loop(diff2, alpha):
  '''Given the difference matrix, find the longest and smoothest loop that we can.
  
  Inputs:
  diff2 - a square 2d numpy array of dtype float. Each cell contains the cost
          of transitioning from frame i to frame j in the input video.

  alpha - a parameter for how heavily you should weigh the size of the loop
          relative to the transition cost of the loop. Larger alphas favor
          longer loops.

  Outputs:
  s - the beginning frame of the longest loop.
  f - the final frame of the longest loop.

  s, f will the indices in the diff2 matrix that give the maximum score
  according to the following metric:

  alpha*(f-s) - diff2[f,s]
  '''
  s = None
  f = None
  # Insert your code here ------------------------------------------------------
  (rows, cols) = diff2.shape
  maxValue = -10000
  for ss in range(rows):
    for ff in range(cols):
      val = alpha*(ff-ss) - diff2[ff,ss]
      if val > maxValue:
        maxValue = val
        s = ss
        f = ff
  # ----------------------------------------------------------------------------
  return s, f

def synthesize_loop(video_volume, s, f):
  '''Pull out the given loop from video.
  
  Input:
  video_volume - a (t, row, col, 3) array, as created by your video_volume function.
  i - the index of the starting frame.
  j - the index of the ending frame.

  Output:
  output - a list of arrays of size (row, col, 3) and dtype np.uint8, similar to
  the original input the video_volume function in part0.
  '''
  output = [] 
  # Insert your code here ------------------------------------------------------
  for i in range(s, f + 1, 1):
    output.append(video_volume[i, :, :, :])
  # ----------------------------------------------------------------------------
  return output

def test():
  '''This script will perform a unit test on your function, and provide useful
  output.
  '''
  d1 = np.ones((5,5), dtype = float)
  a1 = 1
  out1 = (0,4)

  d2 = np.array([[ 0.,  1.,  1.,  5.],
                 [ 1.,  0.,  3.,  4.],
                 [ 1.,  3.,  0.,  5.],
                 [ 5.,  4.,  5.,  0.]])
  a2 = 1 
  out2 = (0,2)

  d3 = np.array([[ 0.,  1.,  4.],
                 [ 1.,  0.,  1.],
                 [ 4.,  1.,  0.]])   
  a3 = 2
  out3 = (0,1)

  if __name__ == "__main__":
    print 'Evaluating find_biggest_loop'
  for d, a, true_out in zip((d1, d2, d3), (a1, a2, a3), (out1, out2, out3)):
    if __name__ == "__main__":
      print "input:\n{}\n".format(d)
      print "alpha = {}".format(a)

    usr_out = find_biggest_loop(d, a)

    if not usr_out == true_out:
      if __name__ == "__main__":
        print "Error- find_biggest_loop is {}. Expected output is {}.".format(
            usr_out, true_out)
      return False

  if __name__ == "__main__":
    print "find_biggest_loop passed."
    print "testing synthesize_loop."

  video_volume1 = np.array([[[[ 0,  0,  0],
                              [ 0,  0,  0]]],
                            [[[ 1,  1,  1],
                              [ 1,  1,  1]]],
                            [[[ 2,  2,  2],
                              [ 2,  2,  2]]],
                            [[[ 3,  3,  3],
                              [ 3,  3,  3]]]], dtype = np.uint8) 

  video_volume2 = np.array([[[[2, 2, 2],
                              [2, 2, 2],
                              [2, 2, 2],
                              [2, 2, 2]],
                             [[2, 2, 2],
                              [2, 2, 2],
                              [2, 2, 2],
                              [2, 2, 2]]],
                            [[[1, 1, 1],
                              [1, 1, 1],
                              [1, 1, 1],
                              [1, 1, 1]],
                             [[1, 1, 1],
                              [1, 1, 1],
                              [1, 1, 1],
                              [1, 1, 1]]],
                            [[[0, 0, 0],
                              [0, 0, 0],
                              [0, 0, 0],
                              [0, 0, 0]],
                             [[0, 0, 0],
                              [0, 0, 0],
                              [0, 0, 0],
                              [0, 0, 0]]]], dtype = np.uint8)

  frames1 = (2,3)
  frames2 = (1,1)


  out1 = [np.array([[[ 2,  2,  2],
                     [ 2,  2,  2]]], dtype = np.uint8),
          np.array([[[ 3,  3,  3],
                     [ 3,  3,  3]]], dtype = np.uint8)]

  out2 = [np.array([[[1, 1, 1],
                     [1, 1, 1],
                     [1, 1, 1],
                     [1, 1, 1]],
                    [[1, 1, 1],
                     [1, 1, 1],
                     [1, 1, 1],
                     [1, 1, 1]]], dtype = np.uint8)]

  for video_volume, frames, true_out in zip((video_volume1, video_volume2), 
      (frames1, frames2), (out1, out2)):
    if __name__ == "__main__":
      print "input:\n{}\n".format(video_volume)
      print "input frames:\n{}\n".format(frames)

    usr_out = synthesize_loop(video_volume, frames[0], frames[1])

    if not type(usr_out) == type(true_out):
      if __name__ == "__main__":
        print "Error- synthesize_loop has type {}. Expected type is {}.".format(
            type(usr_out), type(true_out))
      return False

    if not len(usr_out) == len(true_out):
      if __name__ == "__main__":
        print "Error - synthesize_loop has len {}. Expected len is {}.".format(
            len(usr_out), len(true_out))
        return False

    for usr_img, true_img in zip(usr_out, true_out):
      if not type(usr_img) == type(true_img):
        if __name__ == "__main__":
          print "Error- synthesize_loop has type {}. Expected type is {}.".format(
              type(usr_img), type(true_img))
        return False

      if not usr_img.shape == true_img.shape:
        if __name__ == "__main__":
          print "Error- synthesize_loop has shape {}. Expected shape is {}.".format(
              usr_img.shape, true_img.shape)
        return False

      if not usr_img.dtype == true_img.dtype:
        if __name__ == "__main__":
          print "Error- synthesize_loop has dtype {}. Expected dtype is {}.".format(
              usr_img.dtype, true_img.dtype)
        return False

      if not np.all(usr_img == true_img):
        if __name__ == "__main__":
          print "Error- synthesize_loop has value:\n{}\nExpected value:\n{}".format(
              usr_img, true_img)
        return False

  if __name__ == "__main__":
    print "synthesize_loop passed."

  if __name__ == "__main__":
    print "All unit tests successful."
  return True

if __name__ == "__main__":
  print "Performing unit tests."

  test()


Viewing all articles
Browse latest Browse all 764

Trending Articles