In [1]:
import numpy as np
import skimage
import skimage.io
import skimage.morphology
import numba
def to_uint8(img):
return np.clip(img, 0, 255).astype(np.uint8)
def laplacian(img):
return (np.roll(img, 1, 0) + np.roll(img, -1, 0) +
np.roll(img, 1, 1) + np.roll(img, -1, 1) -
4 * img)
def laplacian_absmax(img1, img2):
def absmax(a, b):
return np.where(np.abs(a) > np.abs(b), a, b)
res = np.zeros_like(img1)
for axis in [0, 1]:
for delta in [-1, 1]:
res += absmax(np.roll(img1, delta, axis) - img1,
np.roll(img2, delta, axis) - img2)
return res
@numba.jit
def poisson1(mask, sol, rhs):
assert sol.shape[:2] == mask.shape[:2] == rhs.shape[:2], 'Dimensions should be equal'
for i in range(1, sol.shape[0] - 1):
for j in range(1, sol.shape[1] - 1):
if mask[i, j]:
for c in range(3):
sol[i, j, c] = (sol[i - 1, j, c] + sol[i + 1, j, c] +
sol[i, j - 1, c] + sol[i, j + 1, c] -
rhs[i, j, c]) / 4
def poisson(n, mask, sol, rhs):
for i in range(n):
poisson1(mask, sol, rhs)
return sol
In [94]:
back = skimage.io.imread('back_4.png').astype(float)[:, :, :3]
fore = skimage.io.imread('fore_4.png').astype(float)[:, :, :3]
mask = skimage.morphology.binary_erosion((fore != 0).any(axis=2), np.ones((3, 3)))
clone = back.copy()
clone[mask] = fore[mask]
skimage.io.imsave('clone.png', to_uint8(clone))
laplace = poisson(100, mask, back.copy(), np.zeros_like(back))
skimage.io.imsave('laplace.png', to_uint8(laplace))
imported = poisson(100, mask, back.copy(), laplacian(fore))
skimage.io.imsave('import.png', to_uint8(imported))
mixed = poisson(100, mask, back.copy(), laplacian_absmax(fore, back))
skimage.io.imsave('mixed.png', to_uint8(mixed))
grayscale_back = skimage.color.gray2rgb(skimage.color.rgb2gray(back)).copy()
grayscale_back[mask] = back[mask]
grayscale = poisson(100, mask, grayscale_back , laplacian(fore))
skimage.io.imsave('gray.png', to_uint8(grayscale))
In [2]:
import numpy as np
import skimage
import skimage.io
import skimage.morphology
import numba
def grad(x):
return [np.roll(x, 1, 0) - x ,
np.roll(x, 1, 1) - x]
def laplacian_from_grad(g):
return(g[0] - np.roll(g[0], -1, 0) +
g[1] - np.roll(g[1], -1, 1))
In [96]:
import matplotlib.pyplot as plt
%matplotlib inline
In [4]:
#local illum changes
back = skimage.io.imread('back_6.png').astype(float)[:, :, :3]
fore = skimage.io.imread('fore_6.png').astype(float)[:, :, :3]
mask = skimage.morphology.binary_erosion((fore != 0).any(axis=2), np.ones((3, 3)))
eps = 1e-6
img = np.log(back + eps)
img_grad = grad(img)
grad_norms = np.sqrt(np.sum(np.square(img_grad[0]) + np.square(img_grad[1]), axis=2))[:, :,np.newaxis]
#grad_norms = np.sum(np.abs(img_grad[0]) + np.abs(img_grad[1]), axis=2)[:, :,np.newaxis]
avg_grad_norm = np.mean(grad_norms[mask])
beta = 0.2
alpha = 0.2 * avg_grad_norm
grad_target = [alpha**beta * np.abs(grad_norms + eps)**(-beta) * img_grad[0],
alpha**beta * np.abs(grad_norms + eps)**(-beta) * img_grad[1]]
laplacian_target = laplacian_from_grad(grad_target)
res = img.copy()
log_illuminated = poisson(100, mask, res, laplacian_target)
skimage.io.imsave('back_6_illuminated.png', to_uint8(np.exp(log_illuminated) - eps))
In [85]:
for beta in np.arange(0.05, 1, 0.05):
for a in np.arange(0.05, 1, 0.07):
alpha = a * avg_grad_norm
grad_target = [alpha**beta * np.abs(grad_norms + eps)**(-beta) * img_grad[0],
alpha**beta * np.abs(grad_norms + eps)**(-beta) * img_grad[1]]
laplacian_target = laplacian_from_grad(grad_target)
log_illuminated = poisson(100, mask, img.copy(), laplacian_target)
skimage.io.imsave('zilluminated ' + str(int(100 * a)) + " " + str(int(100 * beta)) + '.png',
to_uint8(np.exp(log_illuminated) - eps))
In [19]:
x = np.ones((10,3))
print(x)
print(x * np.ones(10)[:, np.newaxis])