gokaygokay commited on
Commit
929c20c
·
verified ·
1 Parent(s): b920029

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +30 -29
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
- nnz = (mask>0).sum()
73
- im2var = -np.ones(mask.shape[0:2], dtype='int32')
74
- im2var[mask>0] = np.arange(nnz)
75
 
76
- ys, xs = np.where(mask==1)
77
-
78
- A = sp.sparse.lil_matrix((4*nnz, nnz))
79
- b = np.zeros(4*nnz)
80
 
81
- e = 0
82
- for n in range(nnz):
83
- y, x = ys[n], xs[n]
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
- A = sp.sparse.csr_matrix(A)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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