int main(int argc, char **argv) { if (argc < 6) { printf("Usage: ./process input.png levels alpha beta output.png\n" "e.g.: ./process input.png 8 1 1 output.png\n"); return 0; } Image<float> input = load<float>(argv[1]); int levels = atoi(argv[2]); float alpha = atof(argv[3]), beta = atof(argv[4]); Image<float> output(input.width(), input.height(), 3); // Timing code timeval t1, t2; unsigned int bestT = 0xffffffff; for (int i = 0; i < 1; i++) { gettimeofday(&t1, NULL); local_laplacian(levels, alpha/(levels-1), beta, input, output); gettimeofday(&t2, NULL); unsigned int t = (t2.tv_sec - t1.tv_sec) * 1000000 + (t2.tv_usec - t1.tv_usec); if (t < bestT) bestT = t; } printf("%u\n", bestT); local_laplacian(levels, alpha/(levels-1), beta, input, output); save(output, argv[5]); return 0; }
void process(struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, const void *const i, void *const o, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out) { // this is called for preview and full pipe separately, each with its own pixelpipe piece. // get our data struct: dt_iop_bilat_data_t *d = (dt_iop_bilat_data_t *)piece->data; // the total scale is composed of scale before input to the pipeline (iscale), // and the scale of the roi. const float scale = piece->iscale / roi_in->scale; const float sigma_r = d->sigma_r; // does not depend on scale const float sigma_s = d->sigma_s / scale; if(d->mode == s_mode_bilateral) { dt_bilateral_t *b = dt_bilateral_init(roi_in->width, roi_in->height, sigma_s, sigma_r); dt_bilateral_splat(b, (float *)i); dt_bilateral_blur(b); dt_bilateral_slice(b, (float *)i, (float *)o, d->detail); dt_bilateral_free(b); } else // s_mode_local_laplacian { local_laplacian(i, o, roi_in->width, roi_in->height, d->midtone, d->sigma_s, d->sigma_r, d->detail, 0); } if(piece->pipe->mask_display & DT_DEV_PIXELPIPE_DISPLAY_MASK) dt_iop_alpha_copy(i, o, roi_in->width, roi_in->height); }