29 #define MAX_DIST FLT_MAX
31 #define MAX_INT 10000000
57 long double *cross_corr,
size_t nx,
size_t ny)
61 fftwl_plan plan_forward, plan_backward;
64 int fftsize = (int) (ny*((
int) (nx/2)+1));
66 int imsize = (int) (nx*ny);
67 long double invimsize = 1./(
long double) imsize;
70 ldimg = (
long double *) malloc(size*
sizeof(
long double));
71 #pragma omp critical (make_plan)
72 fft1 = (fftwl_complex*) fftwl_malloc(
sizeof(fftwl_complex)*(fftsize));
76 for(i=0; i < (int) ny; i++)
79 si = (i==0) ? 0 : (ny-i);
80 for(j=0; j < (int) nx; j++)
82 sj = (j==0) ? 0 : (nx-j);
83 assert(nx*si+sj<size);
84 ldimg[nx*si+sj] = (
long double) img1[nx*i+j];
87 #pragma omp critical (make_plan)
88 plan_forward = fftwl_plan_dft_r2c_2d(ny,nx,ldimg,fft1,FFTW_ESTIMATE);
89 fftwl_execute(plan_forward);
92 for(i=0; i<fftsize; i++)
96 fft1[i][0] = re*fft2[i][0] - im*fft2[i][1];
97 fft1[i][1] = re*fft2[i][1] + im*fft2[i][0];
100 #pragma omp critical (make_plan)
101 plan_backward = fftwl_plan_dft_c2r_2d(ny,nx,fft1,cross_corr,FFTW_ESTIMATE);
102 fftwl_execute(plan_backward);
105 for(i=0; i<(int) size; i++)
107 cross_corr[i] *= invimsize;
112 #pragma omp critical (make_plan)
113 fftwl_destroy_plan(plan_forward);
114 #pragma omp critical (make_plan)
115 fftwl_destroy_plan(plan_backward);
116 #pragma omp critical (make_plan)
137 long double *patch_normsH,
long double *patch_normsV,
138 long double *patch_normsL,
int patch_sz,
int overlap_sz)
141 long double *sq_rgb_src_im;
142 fftwl_complex *fft_sq_rgb_src_im;
143 fftwl_plan plan_forward;
145 int size = (int) (src_im.
h*src_im.
w);
146 int fftsize = (int) src_im.
h*((
int) (src_im.
w/2)+1);
148 mask_ext = (
float *) calloc(size,
sizeof(
float));
149 for(i=0; i< size; i++) mask_ext[i] = 0.;
150 sq_rgb_src_im = (
long double *) malloc(size*
sizeof(
long double));
151 #pragma omp critical (make_plan)
153 (fftwl_complex*) fftwl_malloc(
sizeof(fftwl_complex)*(fftsize));
157 for(i=0; i<size; i++)
159 sq_rgb_src_im[i] = (
long double) src_im.
img[i]
160 * (
long double) src_im.
img[i]
161 + (
long double) src_im.
img[i+size]
162 * (
long double) src_im.
img[i+size]
163 + (
long double) src_im.
img[i+2*size]
164 * (
long double) src_im.
img[i+2*size];
167 #pragma omp critical (make_plan)
168 plan_forward = fftwl_plan_dft_r2c_2d(src_im.
h,src_im.
w,sq_rgb_src_im,
169 fft_sq_rgb_src_im,FFTW_ESTIMATE);
170 fftwl_execute(plan_forward);
173 for(i=0;i<patch_sz;i++)
175 for(j=0;j<patch_sz;j++)
178 mask_ext[src_im.
w*i+j] = 1.;
180 mask_ext[src_im.
w*i+j] = 0.;
185 patch_normsH, src_im.
w, src_im.
h);
188 for(i=0;i<patch_sz;i++)
190 for(j=0;j<patch_sz;j++)
193 mask_ext[src_im.
w*i+j] = 1.;
195 mask_ext[src_im.
w*i+j] = 0.;
200 patch_normsV, src_im.
w, src_im.
h);
203 for(i=0;i<patch_sz;i++)
205 for(j=0;j<patch_sz;j++)
208 mask_ext[src_im.
w*i+j] = 1.;
209 else if (j<overlap_sz)
210 mask_ext[src_im.
w*i+j] = 1.;
212 mask_ext[src_im.
w*i+j] = 0.;
217 patch_normsL, src_im.
w, src_im.
h);
222 #pragma omp critical (make_plan)
223 fftwl_destroy_plan(plan_forward);
224 #pragma omp critical (make_plan)
225 fftwl_free(fft_sq_rgb_src_im);
253 Corner temp,
int patch_sz,
long double *src_patch_normsH,
254 long double *src_patch_normsV,
long double *src_patch_normsL,
255 fftwl_complex *fft_srcR,fftwl_complex *fft_srcG,
256 fftwl_complex *fft_srcB,
Image_LD *distances)
258 long double *cross_corr;
262 long double normpatch;
263 long double *src_patch_norms;
267 img1 = (
float *) calloc(src_im.
h*src_im.
w,
sizeof(
float));
268 cross_corr = (
long double *) malloc(src_im.
h*src_im.
w*
sizeof(
long double));
270 for(k=0; k<(int)src_im.
c; k++)
275 for(i=0;i<patch_sz;i++)
277 for(j=0;j<patch_sz;j++)
279 patchij = out_im.
img[out_im.
w*(temp.
x+i)+temp.
y+j+
280 k*out_im.
w*out_im.
h];
281 img1[src_im.
w*i+j] = patchij;
282 normpatch += (
long double) patchij * (
long double) patchij;
288 if (k==0) fft2 = fft_srcR;
289 else if (k==1) fft2 = fft_srcG;
290 else fft2 = fft_srcB;
295 for(i=0; i< (int) (src_im.
h*src_im.
w); i++)
299 distances->
img[i] += normpatch - 2.0*cross_corr[i];
305 src_patch_norms = src_patch_normsL;
307 src_patch_norms = src_patch_normsH;
309 src_patch_norms = src_patch_normsV;
311 for(i=0; i<(int) (src_im.
h*src_im.
w); i++)
313 distances->
img[i] += src_patch_norms[i];
342 int rand_num, pos_dist;
344 long double min_dist;
349 for(
int i=0; i<h; i++)
351 for (
int j=0; j<w; j++)
353 pos_dist = i*distances->
w + j;
354 assert(distances->
img[pos_dist]==distances->
img[pos_dist]);
355 if(distances->
img[pos_dist] <
356 min_dist && distances->
img[pos_dist] > 1.)
358 min_dist = distances->
img[pos_dist];
366 for(
int i=0; i<h; i++)
368 for (
int j=0; j<w; j++)
370 pos_dist = i*distances->
w + j;
371 assert(pos_dist < (
int) (distances->
w*distances->
h));
372 if(distances->
img[pos_dist] <= min_dist*(1+tol))
374 cands[count_cands].
x = i;
375 cands[count_cands].
y = j;
380 assert(count_cands>0);
381 assert(count_cands<=h*w);
384 assert(rand_num<count_cands);
385 patch->
x = cands[rand_num].
x;
386 patch->
y = cands[rand_num].
y;
414 long double *src_patch_normsH,
long double *src_patch_normsV,
415 long double *src_patch_normsL, fftwl_complex *fft_srcR,
416 fftwl_complex *fft_srcG, fftwl_complex *fft_srcB,
int h,
int w,
426 src_patch_normsH, src_patch_normsV, src_patch_normsL,
427 fft_srcR, fft_srcG, fft_srcB, &distances);