/* * @brief Photographic tone-reproduction * * @param Y input luminance * @param L output tonemapped intensities * @param use_scales true: local version, false: global version of TMO * @param key maps log average luminance to this value (default: 0.18) * @param phi sharpening parameter (defaults to 1 - no sharpening) * @param num number of scales to use in computation (default: 8) * @param low size in pixels of smallest scale (should be kept at 1) * @param high size in pixels of largest scale (default 1.6^8 = 43) */ void tmo_reinhard02( unsigned int width, unsigned int height, const float *nY, float *nL, bool use_scales, float key, float phi, int num, int low, int high, bool temporal_coherent ) { const pfstmo::Array2D* Y = new pfstmo::Array2D(width, height, const_cast<float*>(nY)); pfstmo::Array2D* L = new pfstmo::Array2D(width, height, nL); int x,y; ::key = key; ::phi = phi; ::range = num; ::scale_low = low; ::scale_high = high; ::use_scales = (use_scales) ? 1 : 0; ::temporal_coherent = temporal_coherent; cvts.xmax = Y->getCols(); cvts.ymax = Y->getRows(); sigma_0 = log (scale_low); sigma_1 = log (scale_high); compute_bessel(); allocate_memory (); // reading image for( y=0 ; y<cvts.ymax ; y++ ) for( x=0 ; x<cvts.xmax ; x++ ) image[y][x][0] = (*Y)(x,y); copy_luminance(); scale_to_midtone(); if( use_scales ) { #ifdef APPROXIMATE build_pyramid(luminance, cvts.xmax, cvts.ymax); #else compute_fourier_convolution(); #endif } tonemap_image(); // saving image for( y=0 ; y<cvts.ymax ; y++ ) for( x=0 ; x<cvts.xmax ; x++ ) (*L)(x,y) = image[y][x][0]; // print_parameter_settings(); deallocate_memory(); clean_pyramid(); delete L; delete Y; }
void copy_channels_node_t::copy_channel( const image::const_image_view_t& src, int src_ch, const image::image_view_t& dst , int dst_ch) { switch( src_ch) { case set_zero: boost::gil::fill_pixels( boost::gil::nth_channel_view( dst, dst_ch), boost::gil::gray32f_pixel_t( 0.0f)); break; case set_one: boost::gil::fill_pixels( boost::gil::nth_channel_view( dst, dst_ch), boost::gil::gray32f_pixel_t( 1.0f)); break; case copy_lum: copy_luminance( src, boost::gil::nth_channel_view( dst, dst_ch)); break; default: boost::gil::copy_pixels( boost::gil::nth_channel_view( src, src_ch), boost::gil::nth_channel_view( dst, dst_ch)); } }