# Project 2: Image Blending

## Brief

• This handout: /course/cs195g/asgn/proj2/handout/
• Stencil code: /course/cs195g/asgn/proj2/stencil/
• Data: /course/cs195g/asgn/proj2/data/
• Handin: cs195g_handin proj2
• Required files: README, code/, html/, html/index.html

## Requirements

You are required to implement a poisson image blending as well as take your own photos and apply your algorithm to those images to get full credit.

## Details

MATLAB stencil code is available in /course/cs195g/asgn/proj2/stencil/. You're free to do this project in whatever language you want, but the TAs are only offering support in MATLAB. One file supplied is fiximages.m which automatically resizes and moves all the images so that one could easily composite them. The stencil code is set up to do this immediately. Feel free to use or ignore this function. Another file getmask.m will allow you to interactively make an image mask.

You should take a look at Pérez, et al., especially section 2: "Discrete Poisson solver", before trying to implement the algorithm. It explains the algorithm in better detail than this handout will.

The algorithm boils down to this: for each pixel under the mask, it's value satisfies the equation:

• f* = source image
• g = target image
• p = pixel
• Ω = pixels under the mask
• ∂Ω = pixels who have at least one neighbor under the mask
• Np = neighborhood of pixel p
• fp = new value of pixel p (the value you are solving for)
• f*p = value of pixel p in in the source image
• vpq = gradient of the pixel to a neighbor in the source image g

If you were to look at the equation as just solving for fp, you would see that the equation simplifies to the new pixel value equals the average of it's neighborhood plus the gradient of the pixel to it's neighbors. Notice that the value taken for the neighbor is the new value (fq) if the neighbor is under the mask and it is the target image value otherwise. Since the new (unknown) pixels may have neighbors who are also unknown, you can think of the problem recursively or as a large series of constraints. Each pixel in the target image is assigned a variable, P1,1, P1,2, P1,n, P2,1,..., through Pm,n for an m by n image. Thus, the constraints put on the variable Pi,j are:

• If Pi,j ∉ Ω, Pi,j = Targeti,j
• Otherwise: (# of neighbors) * Pi,j =
sum for each connected neighbor Q: (i-1,j), (i+1,j), (i,j-1), (i,j+1)
if Q is under the mask,
+QUnknown
else
+QTarget
end
+(PSource - QSource)

The above constraints yield m*n linear equations with m*n unknowns. which can be represented in the standard matrix form Ax = b and solved to get exactly one solution. Here P is a column vector comprised of the m*n variables (pixels) in the final image, A is composed of the constraint equations listed above and b is a combination of known pixel values and calculated values.

The coefficient matrix will be mostly sparse since the only pixels affecting the output value are the given pixel and 4 of it's neighbors. (Hint: use a sparse matrix). Also instead of using inv(A) in Matlab to solve Ax=b, use: x = A\b; where A is the coefficient matrix, b is the solution vector, and x is the output values for the pixels. If you don't, you might get annoying errors that make no sense.

## Write up

For this project, just like all other projects, you must do a project report in HTML. In the report you will describe your algorithm and any decisions you made to write your algorithm a particular way. Then you will show and discuss the results of your algorithm. Also discuss any extra credit you did. Feel free to add any other information you feel is relevant.

## Extra Credit

You are free to do whatever extra credit you can think of. Here are some suggestions:

• Mixing Gradients to allow transparent images or images with holes (from the paper)
• Automatically shifting the offset of the source image to decrease the difference of the images in the composite area
• Implement and compare other blending techniques, such as Laplacian pyramid blending
• Experiment with other heuristics and metrics, such as down-weighting areas of high gradient in the source image

To get graduate credit on this project you must do one form of extra credit of sufficient difficulty. Any one of the suggested extra credit satisfies this requirement.

## Handing in

This is very important as you will lose points if you do not follow instructions. Every time after the first that you do not follow instructions, you will lose 5 points. The folder you hand in must contain the following:

• README - text file containing anything about the project that you want to tell the TAs
• code/ - directory containing all your code for this assignment
• html/ - directory containing all your html report for this assignment (including images)

Then run: cs195g_handin proj2
If it is not in your path, you can run it directly: /course/cs195g/bin/cs195g_handin proj2

## Rubric

• +70 pts: Seamless image blending implementation
• +10 pts: Using at least 5 images you have taken
• +20 pts: Write up
• +20 pts: Extra credit (up to twenty points)