static void transform_roi_buffers(float *y, float *x, int n, int roi) { float x_p0[3*n*n], *x_p = x_p0; ppsmooth_vec(x_p0, x, n, n, 3); if (roi == 2) x_p = x; if (roi == 3) { for (int i = 0; i < 3*n*n; i++) y[i]=x_p0[i]; return; } float *c = xmalloc(n*n*sizeof*c); float *ys = xmalloc(n*n*sizeof*c); fftwf_complex *fc = fftwf_xmalloc(n*n*sizeof*fc); for (int l = 0; l < 3; l++) { for (int i = 0; i < n*n; i++) c[i] = x_p[3*i+l]; fft_2dfloat(fc, c, n, n); for (int i = 0; i < n*n; i++) //ys[i] = cabs(fc[i]); ys[i] = 255*(log(cabs(fc[i])/255)+0.5)/5; //float fac = n*13; float fac = n*3; for (int j = 0; j < n; j++) for (int i = 0; i < n; i++) { int ii = (i + n/2) % n; int jj = (j + n/2) % n; float norm = hypot(i-n/2-1, j-n/2-1) / fac; y[3*(j*n+i)+l] = ys[jj*n+ii] * 1;//norm; } } free(ys); free(c); fftwf_free(fc); //float param[1] = {0.5}; //blur_2d(y, y, n, n, 3, "cauchy", param, 1); }
static void dht(float *y, float *x, int w, int h) { fftwf_complex *gc = xmalloc(w*h*sizeof*gc); fft_2dfloat(gc, x, w, h); for (int i = 0; i < w*h; i++) y[i] = (crealf(gc[i]) - cimagf(gc[i]))/sqrt(w*h); fftwf_free(gc); }
void periodic_component(float *y, float *x, int w, int h) { float *lx = xmalloc(w*h*sizeof*lx); complex float *flx = xmalloc(w*h*sizeof*flx); symmetric_laplacian(lx, x, w, h); fft_2dfloat(flx, lx, w, h); for (int j = 0; j < h; j++) for (int i = 0; i < w; i++) { int idx = w*j + i; float k = (2 * M_PI / w) * symmetric_index(i, w); float l = (2 * M_PI / h) * symmetric_index(j, l); flx[idx] /= k*k + l*k; } ifft_2dfloat(y, flx, w, h); free(flx); free(lx); }