Nima Kalantari
CSCE 448/748 – Computational Photography
Blending
Many slides from Alexei A. Efros, James Hayes, Rob Fergus
Goal
Gradient manipulation
Slide credit: F. Durand
Goal
Gradient domain cloning
Gradient blending (1D) – Example 1
source
target
Gradient blending (1D) – Example 1
source
target
Gradient blending (1D) – Example 2
source
target
Gradient blending (1D) – Example 2
It is impossible to faithfully preserve the gradients
source
target
Membrane interpolation
Slide credit: F. Durand
1D example: minimization
Slide credit: F. Durand
1D example: minimization
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | -1 | 2 | -1 | 0 | 0 | 0 | 0 |
0 | 0 | -1 | 2 | -1 | 0 | 0 | 0 |
0 | 0 | 0 | -1 | 2 | -1 | 0 | 0 |
0 | 0 | 0 | 0 | -1 | 2 | -1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
f0 |
f1 |
f2 |
f3 |
f4 |
f5 |
f6 |
f7 |
3 |
6 |
0 |
0 |
0 |
0 |
1 |
2 |
*
=
Slide credit: F. Durand
1D example
f0 |
f1 |
f2 |
f3 |
f4 |
f5 |
f6 |
f7 |
=
3 |
6 |
5 |
4 |
3 |
2 |
1 |
2 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | -1 | 2 | -1 | 0 | 0 | 0 | 0 |
0 | 0 | -1 | 2 | -1 | 0 | 0 | 0 |
0 | 0 | 0 | -1 | 2 | -1 | 0 | 0 |
0 | 0 | 0 | 0 | -1 | 2 | -1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
f0 |
f1 |
f2 |
f3 |
f4 |
f5 |
f6 |
f7 |
3 |
6 |
0 |
0 |
0 |
0 |
1 |
2 |
*
=
Slide credit: F. Durand
Membrane interpolation
Slide credit: F. Durand
Seamless Poisson cloning
Pasted gradient
Slide credit: F. Durand
Discrete 1D example: minimization
Slide credit: F. Durand
Discrete 1D example: minimization
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | -1 | 2 | -1 | 0 | 0 | 0 | 0 |
0 | 0 | -1 | 2 | -1 | 0 | 0 | 0 |
0 | 0 | 0 | -1 | 2 | -1 | 0 | 0 |
0 | 0 | 0 | 0 | -1 | 2 | -1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
f0 |
f1 |
f2 |
f3 |
f4 |
f5 |
f6 |
f7 |
3 |
6 |
2 |
-3 |
3 |
0 |
1 |
2 |
*
=
Slide credit: F. Durand
Discrete 1D example: minimization
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | -1 | 2 | -1 | 0 | 0 | 0 | 0 |
0 | 0 | -1 | 2 | -1 | 0 | 0 | 0 |
0 | 0 | 0 | -1 | 2 | -1 | 0 | 0 |
0 | 0 | 0 | 0 | -1 | 2 | -1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
f0 |
f1 |
f2 |
f3 |
f4 |
f5 |
f6 |
f7 |
3 |
6 |
2 |
-3 |
3 |
0 |
1 |
2 |
*
=
f0 |
f1 |
f2 |
f3 |
f4 |
f5 |
f6 |
f7 |
=
3 |
6 |
6 |
4 |
5 |
3 |
1 |
2 |
Slide credit: F. Durand
Simple 2d example
output, x
? | ? | ? | ? |
? | ? | ? | ? |
? | ? | ? | ? |
What properties do we want x to have?
source, s
target, t
mask
.8 | .6 | .6 | .6 |
.6 | .6 | .2 | .6 |
.6 | .8 | .6 | .6 |
.2 | .5 | .2 | .2 |
.7 | .7 | .7 | .7 |
.9 | .9 | .8 | .9 |
| | | |
| | | |
| | | |
Simple 2d example
output, x
? | ? | ? | ? |
? | ? | ? | ? |
? | ? | ? | ? |
source, s
target, t
mask
.8 | .6 | .6 | .6 |
.6 | .6 | .2 | .6 |
.6 | .8 | .6 | .6 |
.2 | .5 | .2 | .2 |
.7 | .7 | .7 | .7 |
.9 | .9 | .8 | .9 |
| | | |
| | | |
| | | |
Simple 2d example
source, s
target, t
mask
Pixel indexing
1 | 4 | 7 | 10 |
2 | 5 | 8 | 11 |
3 | 6 | 9 | 12 |
output, x
x1 = t1
x2 = t2
x3 = t3
x4 = t4
4x5 – x4 – x2 – x6 – x8 = 4s5 – s4 – s2 – s6 – s8
x6 = t6
x7 = t7
4x8 – x7 – x5 – x9 – x11 = 4s8 – s7 – s5 – s9 – s11
x9 = t9
x10 = t10
x11 = t11
x12 = t12
0 | -1 | 0 |
-1 | 4 | -1 |
0 | -1 | 0 |
Laplacian
| | | |
| | | |
| | | |
? | ? | ? | ? |
? | ? | ? | ? |
? | ? | ? | ? |
.8 | .6 | .6 | .6 |
.6 | .6 | .2 | .6 |
.6 | .8 | .6 | .6 |
.2 | .5 | .2 | .2 |
.7 | .7 | .7 | .7 |
.9 | .9 | .8 | .9 |
Simple 2d example
x1 = 0.2
x2 = 0.7
x3 = 0.9
x4 = 0.5
4x5 – x4 – x2 – x6 – x8 = 0.2
x6 = 0.9
x7 = 0.2
4x8 – x7 – x5 – x9 – x11 = -1.6
x9 = 0.8
x10 = 0.2
x11 = 0.7
x12 = 0.9
source, s
target, t
mask
Pixel indexing
1 | 4 | 7 | 10 |
2 | 5 | 8 | 11 |
3 | 6 | 9 | 12 |
output, x
0 | -1 | 0 |
-1 | 4 | -1 |
0 | -1 | 0 |
Laplacian
| | | |
| | | |
| | | |
? | ? | ? | ? |
? | ? | ? | ? |
? | ? | ? | ? |
.8 | .6 | .6 | .6 |
.6 | .6 | .2 | .6 |
.6 | .8 | .6 | .6 |
.2 | .5 | .2 | .2 |
.7 | .7 | .7 | .7 |
.9 | .9 | .8 | .9 |
Simple 2d example
4x5 – 0.5 – 0.7 – 0.9 – x8 = 0.2
4x8 – 0.2 – x5 – 0.8 – 0.7 = -1.6
4x5– x8 = 2.3
4x8 – x5 = 0.1
x5 = 0.62
x8 = 0.18
In this simple case, we could solve for everything by hand.
source, s
target, t
mask
Pixel indexing
1 | 4 | 7 | 10 |
2 | 5 | 8 | 11 |
3 | 6 | 9 | 12 |
output, x
0 | -1 | 0 |
-1 | 4 | -1 |
0 | -1 | 0 |
Laplacian
| | | |
| | | |
| | | |
? | ? | ? | ? |
? | ? | ? | ? |
? | ? | ? | ? |
.8 | .6 | .6 | .6 |
.6 | .6 | .2 | .6 |
.6 | .8 | .6 | .6 |
.2 | .5 | .2 | .2 |
.7 | .7 | .7 | .7 |
.9 | .9 | .8 | .9 |
x1 = 0.2
x2 = 0.7
x3 = 0.9
x4 = 0.5
4x5 – x4 – x2 – x6 – x8 = 0.2
x6 = 0.9
x7 = 0.2
4x8 – x7 – x5 – x9 – x11 = -1.6
x9 = 0.8
x10 = 0.2
x11 = 0.7
x12 = 0.9
Simple 2d example
*
=
1 | | | | | | | | | | | |
| 1 | | | | | | | | | | |
| | 1 | | | | | | | | | |
| | | 1 | | | | | | | | |
| -1 | | -1 | 4 | -1 | | -1 | | | | |
| | | | | 1 | | | | | | |
| | | | | | 1 | | | | | |
| | | | -1 | | -1 | 4 | -1 | | -1 | |
| | | | | | | | 1 | | | |
| | | | | | | | | 1 | | |
| | | | | | | | | | 1 | |
| | | | | | | | | | | 1 |
.2 |
.7 |
.9 |
.5 |
.2 |
.9 |
.2 |
-1.6 |
.8 |
.2 |
.7 |
.9 |
A
x
b
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
source, s
target, t
mask
Pixel indexing
1 | 4 | 7 | 10 |
2 | 5 | 8 | 11 |
3 | 6 | 9 | 12 |
output, x
0 | -1 | 0 |
-1 | 4 | -1 |
0 | -1 | 0 |
Laplacian
| | | |
| | | |
| | | |
? | ? | ? | ? |
? | ? | ? | ? |
? | ? | ? | ? |
.8 | .6 | .6 | .6 |
.6 | .6 | .2 | .6 |
.6 | .8 | .6 | .6 |
.2 | .5 | .2 | .2 |
.7 | .7 | .7 | .7 |
.9 | .9 | .8 | .9 |
Simple 2d example
*
=
1 | | | | | | | | | | | |
| 1 | | | | | | | | | | |
| | 1 | | | | | | | | | |
| | | 1 | | | | | | | | |
| -1 | | -1 | 4 | -1 | | -1 | | | | |
| | | | | 1 | | | | | | |
| | | | | | 1 | | | | | |
| | | | -1 | | -1 | 4 | -1 | | -1 | |
| | | | | | | | 1 | | | |
| | | | | | | | | 1 | | |
| | | | | | | | | | 1 | |
| | | | | | | | | | | 1 |
.2 |
.7 |
.9 |
.5 |
.2 |
.9 |
.2 |
-1.6 |
.8 |
.2 |
.7 |
.9 |
A
x
b
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
? |
source, s
target, t
mask
Pixel indexing
1 | 4 | 7 | 10 |
2 | 5 | 8 | 11 |
3 | 6 | 9 | 12 |
output, x
0 | -1 | 0 |
-1 | 4 | -1 |
0 | -1 | 0 |
Laplacian
| | | |
| | | |
| | | |
? | ? | ? | ? |
? | ? | ? | ? |
? | ? | ? | ? |
.8 | .6 | .6 | .6 |
.6 | .6 | .2 | .6 |
.6 | .8 | .6 | .6 |
.2 | .5 | .2 | .2 |
.7 | .7 | .7 | .7 |
.9 | .9 | .8 | .9 |
A * x = b
A-1A * x = A-1b
x = A-1b
Simple 2d example
*
=
.2 |
.7 |
.9 |
.5 |
.62 |
.9 |
.2 |
.18 |
.8 |
.2 |
.7 |
.9 |
source, s
target, t
mask
Pixel indexing
1 | 4 | 7 | 10 |
2 | 5 | 8 | 11 |
3 | 6 | 9 | 12 |
output, x
0 | -1 | 0 |
-1 | 4 | -1 |
0 | -1 | 0 |
Laplacian
| | | |
| | | |
| | | |
? | ? | ? | ? |
? | ? | ? | ? |
? | ? | ? | ? |
.8 | .6 | .6 | .6 |
.6 | .6 | .2 | .6 |
.6 | .8 | .6 | .6 |
.2 | .5 | .2 | .2 |
.7 | .7 | .7 | .7 |
.9 | .9 | .8 | .9 |
1 | | | | | | | | | | | |
| 1 | | | | | | | | | | |
| | 1 | | | | | | | | | |
| | | 1 | | | | | | | | |
| -1 | | -1 | 4 | -1 | | -1 | | | | |
| | | | | 1 | | | | | | |
| | | | | | 1 | | | | | |
| | | | -1 | | -1 | 4 | -1 | | -1 | |
| | | | | | | | 1 | | | |
| | | | | | | | | 1 | | |
| | | | | | | | | | 1 | |
| | | | | | | | | | | 1 |
.2 |
.7 |
.9 |
.5 |
.2 |
.9 |
.2 |
-1.6 |
.8 |
.2 |
.7 |
.9 |
A
x
b
Simple 2d example
output, x
.2 | .5 | .2 | .2 |
.7 | .62 | .18 | .7 |
.9 | .9 | .8 | .9 |
source, s
target, t
mask
Pixel indexing
1 | 4 | 7 | 10 |
2 | 5 | 8 | 11 |
3 | 6 | 9 | 12 |
0 | -1 | 0 |
-1 | 4 | -1 |
0 | -1 | 0 |
Laplacian
| | | |
| | | |
| | | |
.8 | .6 | .6 | .6 |
.6 | .6 | .2 | .6 |
.6 | .8 | .6 | .6 |
.2 | .5 | .2 | .2 |
.7 | .7 | .7 | .7 |
.9 | .9 | .8 | .9 |
.2 |
.7 |
.9 |
.5 |
.62 |
.9 |
.2 |
.18 |
.8 |
.2 |
.7 |
.9 |
x
Example
source
target
mask
no blending
gradient domain blending
What’s the difference?
no blending
gradient domain blending
-
=
Perez et al. SIGGRAPH 03
Perez et al. SIGGRAPH 03
Mixing gradients
Source
Average
Mixed