bool FluxCalibrationInstance::ExecuteOn( View& view ) { AutoViewLock lock( view ); ImageVariant image = view.Image(); if ( image.IsComplexSample() ) throw Error( "FluxCalibration cannot be executed on complex images." ); StandardStatus status; image->SetStatusCallback( &status ); image->Status().Initialize( "Flux calibration", image->NumberOfPixels() ); Console().EnableAbort(); if ( image.IsFloatSample() ) switch ( image.BitsPerSample() ) { case 32: FluxCalibrationEngine::Apply( static_cast<Image&>( *image ), view, *this ); break; case 64: FluxCalibrationEngine::Apply( static_cast<DImage&>( *image ), view, *this ); break; } else switch ( image.BitsPerSample() ) { case 8: case 16: { ImageVariant tmp; tmp.CreateFloatImage( 32 ); tmp.CopyImage( image ); FluxCalibrationEngine::Apply( static_cast<Image&>( *tmp ), view, *this ); image.CopyImage( tmp ); } break; case 32: { ImageVariant tmp; tmp.CreateFloatImage( 64 ); tmp.CopyImage( image ); FluxCalibrationEngine::Apply( static_cast<DImage&>( *tmp ), view, *this ); image.CopyImage( tmp ); } break; } return true; }
bool LarsonSekaninaInstance::ExecuteOn( View& view ) { AutoViewLock lock( view ); ImageVariant image = view.Image(); if ( image.IsComplexSample() ) return false; StandardStatus status; image.SetStatusCallback( &status ); Console().EnableAbort(); ImageVariant sharpImg; sharpImg.CreateFloatImage( (image.BitsPerSample() > 32) ? image.BitsPerSample() : 32 ); sharpImg.AllocateImage( image->Width(), image->Height(), 1, ColorSpace::Gray ); if ( useLuminance && image->IsColor() ) { ImageVariant L; image.GetLightness( L ); Convolve( L, sharpImg, interpolation, radiusDiff, angleDiff, center, 0 ); ApplyFilter( L, sharpImg, amount, threshold, deringing, rangeLow, rangeHigh, false, 0, highPass ); image.SetLightness( L ); } else { for ( int c = 0, n = image->NumberOfNominalChannels(); c < n; ++c ) { image->SelectChannel( c ); if ( n > 1 ) Console().WriteLn( "<end><cbr>Processing channel #" + String( c ) ); Convolve( image, sharpImg, interpolation, radiusDiff, angleDiff, center, c ); ApplyFilter( image, sharpImg, amount, threshold, deringing, rangeLow, rangeHigh, disableExtension, c, highPass ); } } return true; }