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

Computational Photography Programming Assignment 3 – Image

$
0
0
import numpy as np
import scipy.signal
import cv2

def generating_kernel(a):
  '''Return a 5x5 generating kernel with parameter a.
  '''
  w_1d = np.array([0.25 - a/2.0, 0.25, a, 0.25, 0.25 - a/2.0])
  return np.outer(w_1d, w_1d)

def reduce(image):
  '''Reduce the image to half the size.

  image - a float image of shape (r, c)
  output - a float image of shape (ceil(r/2), ceil(c/2))
  
  For instance, if the input is 5x7, the output will be 3x4.

  You should filter the image with a generating kernel of a = 0.4, and then
  sample every other point.

  Please consult the lectures and tutorial videos for a more in-depth discussion
  of the reduce function.
  '''
  out = None
  # Insert your code here ------------------------------------------------------
  kernel = generating_kernel(0.4)
  import scipy.signal
  smooth = scipy.signal.convolve(image, kernel, 'same')
  size = image.shape
  import math
  width = int(math.ceil(size[0]/2.0))
  height = int(math.ceil(size[1]/2.0))
  out = np.zeros((width, height), dtype = np.float)
  for i in range(width):
    for j in range(height):
      out[i, j] = smooth[2*i, 2*j]

  # ----------------------------------------------------------------------------
  return out
  
def expand(image):
  '''Expand the image to double the size.

  image - a float image of shape (r, c)
  output - a float image of shape (2*r, 2*c)

  You should upsample the image, and then filter it with a generating kernel of
  a = 0.4. Finally, scale the output by the appropraite amount to make sure that
  the net weight contributing to each output pixel is 1.

  Please consult the lectures and tutorial videos for a more in-depth discussion
  of the expand function.
  '''
  out = None
  # Insert your code here ------------------------------------------------------
  (width, height) = image.shape
  out = np.zeros((2*width, 2*height), dtype = np.float)
  for i in range(width):
    for j in range(height):
      out[2*i, 2*j] = image[i, j]
  kernel = generating_kernel(0.4)

  # ----------------------------------------------------------------------------
  return out

def test():
  '''This script will perform a unit test on your function, and provide useful
  output.
  '''
  # Each subsequent layer is a reduction of the previous one
  reduce1 =[np.array([[   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.],
                      [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.],
                      [   0.,    0.,  255.,  255.,  255.,  255.,    0.,    0.],
                      [   0.,    0.,  255.,  255.,  255.,  255.,    0.,    0.],
                      [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.],
                      [   0.,    0.,    0.,    0.,    0.,    0.,    0.,    0.]]),
            np.array([[   0.64,    8.92,   12.11,    3.82],
                      [   8.29,  116.03,  157.46,   49.73],
                      [   3.82,   53.55,   72.67,   22.95]]),
            np.array([[ 12.21,  31.85],
                      [ 17.62,  45.97]]),
            np.array([[ 9.77]])] 

  reduce2 = [np.array([[ 255.,  255.,  255.,  255.,  255.,  255.,  255.],
                       [ 255.,  255.,  255.,  255.,  255.,  255.,  255.],
                       [ 255.,  255.,  125.,  125.,  125.,  255.,  255.],
                       [ 255.,  255.,  125.,  125.,  125.,  255.,  255.],
                       [   0.,    0.,    0.,    0.,    0.,    0.,    0.]]),
             np.array([[ 124.62,  173.95,  173.95,  124.62],
                       [ 165.35,  183.1 ,  183.1 ,  165.35],
                       [  51.6 ,   49.2 ,   49.2 ,   51.6 ]]),
             np.array([[  72.85,  104.71],
                       [  49.53,   68.66]]),
             np.array([[ 31.37]])] 

  if __name__ == "__main__":
    print 'Evaluating reduce.'
  for red_pyr in reduce1, reduce2:
    for imgin, true_out in zip(red_pyr[0:-1], red_pyr[1:]):
      if __name__ == "__main__":
        print "input:\n{}\n".format(imgin)

      usr_out = reduce(imgin)

      if not type(usr_out) == type(true_out):
        if __name__ == "__main__":
          print "Error- reduce out 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- reduce out 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- reduce out 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- reduce out has value:\n{}\nExpected value:\n{}".format(
              usr_out, true_out)
        return False

  if __name__ == "__main__":
    print "reduce passed.\n"
    print "Evaluating expand."

  expandin = [np.array([[255]]),
              np.array([[125, 255],
                        [255,   0]]),
              np.array([[ 255.,    0.,  125.,  125.,  125.],
                        [ 255.,    0.,  125.,  125.,  125.],
                        [  50.,   50.,   50.,   50.,   50.]])] 

  expandout =[np.array([[ 163.2 ,  102.  ],
                        [ 102.  ,   63.75]]),
              np.array([[ 120.8 ,  164.75,  175.75,  102.  ],
                        [ 164.75,  158.75,  121.  ,   63.75],
                        [ 175.75,  121.  ,   42.05,   12.75],
                        [ 102.  ,   63.75,   12.75,    0.  ]]),
              np.array([[ 183.6, 114.75, 34.2, 56.25, 101.25, 112.5, 112.5,112.5, 101.25,  56.25],
                        [ 204. ,  127.5,  38.,  62.5,  112.5,  125.,  125., 125.,  112.5,  62.5 ],
                        [ 188.1, 119.75, 39.2, 61.25, 106.25, 117.5, 117.5,117.5, 105.75,  58.75],
                        [ 124.5,  88.75, 44. , 56.25,  81.25,  87.5,  87.5, 87.5,  78.75,  43.75],
                        [  56.4,  52.75, 43.8, 46.25,  51.25,  52.5,  52.5, 52.5,  47.25,  26.25],
                        [  22.5,    25.,  25.,   25.,    25.,   25.,   25.,  25.,   22.5,  12.5 ]])]

  for imgin, true_out in zip(expandin, expandout):
    if __name__ == "__main__":
      print "input:\n{}\n".format(imgin)

    usr_out = expand(imgin)

    if not type(usr_out) == type(true_out):
      if __name__ == "__main__":
        print "Error- expand out 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- expand out 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- expand out 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- expand out has value:\n{}\nExpected value:\n{}".format(
            usr_out, true_out)
      return False

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

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

if __name__ == "__main__":
  print "Performing unit tests. Your functions will be accepted if your result is\
    within 1 of the correct output."
  np.set_printoptions(precision=1)

  test()



Viewing all articles
Browse latest Browse all 764

Trending Articles