Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -68,42 +68,43 @@ def poisson_blend(img_s, mask, img_t):
|
|
68 |
|
69 |
def mixed_blend(img_s, mask, img_t):
|
70 |
img_s_h, img_s_w = img_s.shape
|
|
|
|
|
|
|
71 |
|
72 |
-
|
73 |
-
im2var = -np.ones(mask.shape[0:2], dtype='int32')
|
74 |
-
im2var[mask>0] = np.arange(nnz)
|
75 |
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
b = np.zeros(4*nnz)
|
80 |
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
for n_y, n_x in neighbours(y, x, img_s_h-1, img_s_w-1):
|
86 |
-
ds = img_s[y][x] - img_s[n_y][n_x]
|
87 |
-
dt = img_t[y][x] - img_t[n_y][n_x]
|
88 |
-
d = ds if abs(ds) > abs(dt) else dt
|
89 |
-
|
90 |
-
A[e, im2var[y][x]] = 1
|
91 |
-
b[e] = d
|
92 |
-
|
93 |
-
if im2var[n_y][n_x] != -1:
|
94 |
-
A[e, im2var[n_y][n_x]] = -1
|
95 |
-
else:
|
96 |
-
b[e] += img_t[n_y][n_x]
|
97 |
-
e += 1
|
98 |
|
99 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
v = sp.sparse.linalg.lsqr(A, b)[0]
|
101 |
|
|
|
102 |
img_t_out = img_t.copy()
|
103 |
-
|
104 |
-
for n in range(nnz):
|
105 |
-
y, x = ys[n], xs[n]
|
106 |
-
img_t_out[y][x] = v[im2var[y][x]]
|
107 |
|
108 |
return np.clip(img_t_out, 0, 1)
|
109 |
|
|
|
68 |
|
69 |
def mixed_blend(img_s, mask, img_t):
|
70 |
img_s_h, img_s_w = img_s.shape
|
71 |
+
nnz = np.sum(mask > 0)
|
72 |
+
im2var = np.full(mask.shape, -1, dtype='int32')
|
73 |
+
im2var[mask > 0] = np.arange(nnz)
|
74 |
|
75 |
+
ys, xs = np.where(mask == 1)
|
|
|
|
|
76 |
|
77 |
+
# Precompute neighbor indices
|
78 |
+
y_n = np.clip(np.stack([ys-1, ys+1, ys, ys]), 0, img_s_h-1)
|
79 |
+
x_n = np.clip(np.stack([xs, xs, xs-1, xs+1]), 0, img_s_w-1)
|
|
|
80 |
|
81 |
+
# Compute differences
|
82 |
+
ds = img_s[ys, xs][:, np.newaxis] - img_s[y_n, x_n]
|
83 |
+
dt = img_t[ys, xs][:, np.newaxis] - img_t[y_n, x_n]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
84 |
|
85 |
+
# Choose larger gradient
|
86 |
+
d = np.where(np.abs(ds) > np.abs(dt), ds, dt)
|
87 |
+
|
88 |
+
# Construct sparse matrix A and vector b
|
89 |
+
rows = np.repeat(np.arange(4*nnz), 2)
|
90 |
+
cols = np.column_stack([np.repeat(im2var[ys, xs], 4), im2var[y_n, x_n].ravel()])
|
91 |
+
data = np.column_stack([np.ones(4*nnz), -np.ones(4*nnz)]).ravel()
|
92 |
+
|
93 |
+
mask_n = (im2var[y_n, x_n] != -1).ravel()
|
94 |
+
rows = rows[mask_n]
|
95 |
+
cols = cols[mask_n]
|
96 |
+
data = data[mask_n]
|
97 |
+
|
98 |
+
A = sp.sparse.csr_matrix((data, (rows, cols)), shape=(4*nnz, nnz))
|
99 |
+
b = d.ravel()
|
100 |
+
b[~mask_n] += img_t[y_n, x_n].ravel()[~mask_n]
|
101 |
+
|
102 |
+
# Solve the system
|
103 |
v = sp.sparse.linalg.lsqr(A, b)[0]
|
104 |
|
105 |
+
# Update the target image
|
106 |
img_t_out = img_t.copy()
|
107 |
+
img_t_out[ys, xs] = v
|
|
|
|
|
|
|
108 |
|
109 |
return np.clip(img_t_out, 0, 1)
|
110 |
|