28 #define min(a,b) (a<=b)?(a):(b)
29 #define max(a,b) (a>b)?(a):(b)
30 #define abs(a) (a<0)?-(a):(a)
54 Image *paths,
int ps,
int os,
int x,
int y,
Corner patch_src)
56 int ii,jj, kk, ll, mm, pos_o, pos_e, pos_s, posE_x, pos_P,
57 aux1, aux2, aux3, m1, m2, inc_o, inc_s;
61 inc_o = out_im->
h*out_im->
w;
62 inc_s = src_im.
h*src_im.
w;
66 for (ii=0; ii<ps; ii++)
72 for (jj=0; jj<os; jj++)
74 pos_o = (kk + x)*out_im->
w + (y + jj);
76 pos_s = (patch_src.
x + kk)*src_im.
w +(patch_src.
y +jj);
78 pos_P = (mm)*paths->
w + jj;
80 assert(pos_o<(
int)(out_im->
h*out_im->
w));
81 assert(pos_e<(
int)(e.
h*e.
w));
84 e.
img[pos_e] = (out_im->
img[pos_o] - src_im.
img[pos_s]) *
85 (out_im->
img[pos_o] - src_im.
img[pos_s])
87 (out_im->
img[pos_o+inc_o] - src_im.
img[pos_s+inc_s]) *
88 (out_im->
img[pos_o+inc_o] - src_im.
img[pos_s+inc_s])
90 (out_im->
img[pos_o+2*inc_o] - src_im.
img[pos_s+2*inc_s]) *
91 (out_im->
img[pos_o+2*inc_o] - src_im.
img[pos_s+2*inc_s]);
98 E->
img[pos_e] = e.
img[pos_e];
102 assert(pos_s<(
int)(src_im.
h*src_im.
w));
103 assert(pos_P<(
int)(paths->
w*paths->
h));
104 assert(posE_x<=(
int)((ps-1)*e.
w));
107 aux2 = E->
img[posE_x + jj];
111 aux3 = E->
img[posE_x + (jj+1)];
113 E->
img[pos_e] = e.
img[pos_e] + m1;
116 paths->
img[pos_P] = 0;
117 else if ( m1 == aux3 )
118 paths->
img[pos_P] = 1;
123 aux1 = E->
img[posE_x + (jj-1)];
125 E->
img[pos_e] = e.
img[pos_e] + m1;
128 paths->
img[pos_P] = -1;
129 else if ( m1 == aux2 )
130 paths->
img[pos_P] = 0;
135 aux1 = E->
img[posE_x+ (jj-1)];
136 aux3 = E->
img[posE_x + (jj+1)];
139 E->
img[pos_e] = e.
img[pos_e] + m2;
142 paths->
img[pos_P] = -1;
143 else if ( m2 == aux2 )
144 paths->
img[pos_P] = 0;
145 else if ( m2 == aux3 )
146 paths->
img[pos_P] = 1;
180 Image *paths,
int ps,
int os,
int x,
int y,
Corner patch_src)
182 int ii, jj, kk, ll, mm, pos_o, pos_e, pos_s,
183 posE_y, pos_P, aux1, aux2, aux3, m1, m2;
187 int inc_o = out_im->
h*out_im->
w;
188 int inc_s = src_im.
h*src_im.
w;
192 for (jj=0; jj<ps; jj++)
195 ll = ps - 1 - (jj-1);
196 mm = ps - 2 - (jj-1);
198 for (ii=0; ii<os; ii++)
200 pos_o = (x + ii)*out_im->
w + (y + kk);
202 pos_s = (patch_src.
x + ii)*src_im.
w +(patch_src.
y +kk);
204 pos_P = ii*paths->
w + mm;
206 assert(pos_o<(
int)(out_im->
h*out_im->
w));
207 assert(pos_e<(
int)(e.
h*e.
w));
211 (out_im->
img[pos_o] - src_im.
img[pos_s]) *
212 (out_im->
img[pos_o] - src_im.
img[pos_s])
214 (out_im->
img[pos_o+inc_o] - src_im.
img[pos_s+inc_s]) *
215 (out_im->
img[pos_o+inc_o] - src_im.
img[pos_s+inc_s])
217 (out_im->
img[pos_o+2*inc_o] - src_im.
img[pos_s+2*inc_s]) *
218 (out_im->
img[pos_o+2*inc_o] - src_im.
img[pos_s+2*inc_s]);
224 E->
img[pos_e] = e.
img[pos_e];
227 assert(pos_s<(
int)(src_im.
h*src_im.
w));
228 assert(posE_y<(
int)ps);
229 assert(pos_P<(
int)(paths->
w*paths->
h));
232 aux2 = E->
img[(ii)*E->
w + posE_y];
236 aux3 = E->
img[(ii+1)*E->
w + posE_y];
238 E->
img[pos_e] = e.
img[pos_e] + m1;
241 paths->
img[pos_P] = 0;
242 else if ( m1 == aux3 )
243 paths->
img[pos_P] = 1;
248 aux1 = E->
img[(ii-1)*E->
w + posE_y];
250 E->
img[pos_e] = e.
img[pos_e] + m1;
253 paths->
img[pos_P] = -1;
254 else if ( m1 == aux2 )
255 paths->
img[pos_P] = 0;
260 aux1 = E->
img[(ii-1)*E->
w + posE_y];
261 aux3 = E->
img[(ii+1)*E->
w + posE_y];
264 E->
img[pos_e] = e.
img[pos_e] + m2;
267 paths->
img[pos_P] = -1;
268 else if ( m2 == aux2 )
269 paths->
img[pos_P] = 0;
270 else if ( m2 == aux3 )
271 paths->
img[pos_P] = 1;
297 int ymin, ii, jj, counter, num_rand;
301 assert((0)*E_V->
w + ymin<E_V->w*E_V->
h);
302 minE = E_V->
img[(0)*E_V->
w + ymin];
303 for (jj=1; jj<os; jj++)
305 assert((0)*E_V->
w + jj < E_V->w*E_V->
h);
306 if (E_V->
img[(0)*E_V->
w + jj] < minE)
308 minE = E_V->
img[(0)*E_V->
w + jj];
313 for (jj=0; jj<os; jj++)
315 if (E_V->
img[(0)*E_V->
w + jj]==minE)
325 assert(num_rand < counter);
326 assert(num_rand < os);
330 for (jj=0; jj<=ymin; jj++)
332 assert((0)*boundary_mask->
w + jj<boundary_mask->w*boundary_mask->
h);
333 boundary_mask->
img[(0)*boundary_mask->
w + jj] = 1;
337 for (ii=1; ii<ps; ii++)
339 assert((ii-1)*(
int)paths_V.
w + ymin < (
int)(paths_V.
w*paths_V.
h));
340 ymin = ymin + paths_V.
img[(ii-1)*(
int)paths_V.
w + ymin];
341 for (jj=0; jj<=ymin; jj++)
343 assert(ii*boundary_mask->
w + jj <
344 boundary_mask->
h*boundary_mask->
w);
345 boundary_mask->
img[ii*boundary_mask->
w + jj] = 1;
368 int xmin, ii, jj, counter, num_rand;
372 assert(xmin*E_H->
w + 0 < E_H->
w*E_H->
h);
373 minE = E_H->
img[xmin*E_H->
w + 0];
374 for (ii=1; ii<os; ii++)
376 assert(ii*E_H->
w + 0 < E_H->
w*E_H->
h);
377 if (E_H->
img[ii*E_H->
w + 0] < minE)
379 minE = E_H->
img[ii*E_H->
w + 0];
385 for (ii=0; ii<os; ii++)
387 if (E_H->
img[ii*E_H->
w + 0] == minE)
397 assert(num_rand<counter);
402 for (ii=0; ii<=xmin; ii++)
404 assert(ii*boundary_mask->
w + 0 < boundary_mask->
w*boundary_mask->
h);
405 boundary_mask->
img[ii*boundary_mask->
w + 0] = 1;
409 for (jj=1; jj<=ps-1; jj++)
411 assert(xmin*(
int)paths_H.
w + (jj-1) < (
int)(paths_H.
w*paths_H.
h));
412 xmin = xmin + paths_H.
img[xmin*(int)paths_H.
w + (jj-1)];
413 for (ii=0; ii<=xmin; ii++)
415 assert(ii*boundary_mask->
w + jj <
416 boundary_mask->
h*boundary_mask->
w);
417 boundary_mask->
img[ii*boundary_mask->
w + jj] = 1;
440 int xmin, ymin, x0, y0, ii, jj, counter, num_rand;
445 minE = E_V->
img[0] + E_H->
img[0];
446 for (ii=1; ii<os; ii++)
448 if (E_V->
img[ii*E_V->
w + ii] + E_H->
img[ii*E_H->
w + ii] < minE)
450 minE = E_V->
img[ii*E_V->
w + ii] + E_H->
img[ii*E_H->
w + ii];
454 for (ii=0; ii<os; ii++)
456 if (E_V->
img[ii*E_V->
w + ii] + E_H->
img[ii*E_H->
w + ii] == minE)
465 assert(num_rand<counter);
467 xmin = diag[num_rand];
472 for (ii=0; ii<=xmin; ii++)
473 for(jj=0; jj<=ymin; jj++)
475 boundary_mask->
img[ii*boundary_mask->
w + jj] = 1;
479 for (ii=x0+1; ii<ps; ii++)
481 assert((ii-1)*(
int)paths_V.
w + ymin < (
int)(paths_V.
w*paths_V.
h));
482 ymin = ymin + paths_V.
img[(ii-1)*(
int)paths_V.
w + ymin];
483 for (jj=0; jj<=ymin; jj++)
485 assert(ii*boundary_mask->
w + jj <
486 boundary_mask->
h*boundary_mask->
w);
487 boundary_mask->
img[ii*boundary_mask->
w + jj] = 1;
490 for (jj=y0+1; jj<ps; jj++)
492 assert(xmin*(
int)paths_H.
w + (jj-1) < (
int)(paths_H.
w*paths_H.
h));
493 xmin = xmin + paths_H.
img[xmin*(int)paths_H.
w + (jj-1)];
494 for (ii=0; ii<=xmin; ii++)
496 assert(ii*boundary_mask->
w + jj <
497 boundary_mask->
h*boundary_mask->
w);
498 boundary_mask->
img[ii*boundary_mask->
w + jj] = 1;
533 boundary_mask->
img[i*boundary_mask->
w] = 1;
536 else if (x == 0 && y > 0)
540 boundary_mask->
img[j] = 1;
543 else if (y == 0 && x > 0)
545 boundary_mask->
img[0] = 1;
548 boundary_mask->
img[i*boundary_mask->
w] = 1;
552 boundary_mask->
img[j] = 1;
560 Image E_V, E_H, paths_V, paths_H;
566 ps, os, x, y, patch_src);
568 ps, os, x, y, patch_src);
580 else if (x == 0 && y > 0)
586 os, x, y, patch_src);
595 else if (y == 0 && x > 0)
601 &paths_H, ps, os, x, y, patch_src);