void PyramidDenoiser::DenoiseLevelBivariate(int level) { if (level < (int)(mpPyramid->GetNumberOfScales() - 1)) { PyramidLevel<double>* pBandSetCurrent; PyramidLevel<double>* pBandSetParent; if (level != -1) { pBandSetCurrent = mpPyramid->GetRecursiveScale(level); pBandSetParent = mpPyramid->GetRecursiveScale(level+1); } else { pBandSetCurrent = mpPyramid->GetResidualScale(); pBandSetParent = mpPyramid->GetRecursiveScale(0); } double avgVariance = 0.0; double scaleNoiseVariance = mSigmaNoise / GetScaledNoiseVarianceFactor( level ); double scaleParentChildFactor = GetScaledParentChildFactor( level); for (int orientationIndex = 0; orientationIndex < pBandSetCurrent->GetNumberOfOrientations(); orientationIndex++) { ArrayGrid<double>* pBandCurrent = pBandSetCurrent->GetOrientedBand( orientationIndex); ArrayGrid<double>* pBandParent = pBandSetParent->GetOrientedBand( orientationIndex); double meanVal = GridStatistics<double>::GetGridMean( pBandCurrent ); double varianceVal = GridStatistics<double>::GetGridVariance( pBandCurrent, meanVal ); #ifdef DEBUG cout << "Denoising level " << level << " and orientationIndex " << orientationIndex << ", variance is " << varianceVal << " and scaled noise variance = " << scaleNoiseVariance << endl << flush; #endif avgVariance += varianceVal; for (int y = 0; y < pBandCurrent->GetHeight(); y++) { for (int x = 0; x < pBandCurrent->GetWidth(); x++) { double sigmaSignal = EstimateSigmaSignal( pBandCurrent, x, y, mSigmaNoise, mWindowSize ); double w1 = pBandCurrent->GetValue(x,y); double w2 = pBandParent->GetValue(x/2,y/2) / scaleParentChildFactor; double shrinkageFactor = ComputeBivariateShrinkagefactor(w1, w2, sigmaSignal, scaleNoiseVariance ); pBandCurrent->SetValue(x,y, shrinkageFactor * w1); } } } #ifdef DEBUG cout << "Average variance at scale level = " << (avgVariance) / (double)(pBandSetCurrent->GetNumberOfOrientations()) << endl << flush; #endif } else { std::cerr << "PyramidDenoiser::DenoiseLevelBivariate: Cannot denoise level " << level << " since top level is " << mpPyramid->GetNumberOfScales() << std::endl << std::flush; } }
void PyramidDenoiser::DenoiseLevelLaplacian(int level) { if (level < (int)(mpPyramid->GetNumberOfScales() - 1)) { PyramidLevel<double>* pBandSet; if (level != -1) { pBandSet = mpPyramid->GetRecursiveScale(level); } else { pBandSet = mpPyramid->GetResidualScale(); } for (int orientationIndex = 0; orientationIndex < pBandSet->GetNumberOfOrientations(); orientationIndex++) { ArrayGrid<double>* pBand = pBandSet->GetOrientedBand( orientationIndex); for (int y = 0; y < pBand->GetHeight(); y++) { for (int x = 0; x < pBand->GetWidth(); x++) { double sigmaSignal = EstimateSigmaSignal( pBand, x, y, mSigmaNoise, mWindowSize ); double w1 = pBand->GetValue(x,y); double shrinkageFactor = ComputeLaplacianShrinkagefactor(w1, sigmaSignal, mSigmaNoise); mpPyramid->GetRecursiveScale( level)->GetOrientedBand( orientationIndex)->SetValue(x,y, shrinkageFactor * w1); } } } } else { std::cerr << "PyramidDenoiser::DenoiseLevelLaplacian: Cannot denoise level " << level << " since top level is " << mpPyramid->GetNumberOfScales() << std::endl << std::flush; } }
bool PyramidKeyPointDetector::MergeOrientations1( int scale ) { ArrayGrid<double>* pEnergyMap = 0; ArrayGrid<double>* pUpscaledEnergyMap = 0; PyramidLevel< std::complex< double > >* pPyrLevel = 0; if (scale >= 0) { pPyrLevel = mpPyramid->GetRecursiveScale( scale ); } else { pPyrLevel = mpPyramid->GetResidualScale( ); } int width = pPyrLevel->GetWidth(); int height = pPyrLevel->GetHeight(); bool needsInitialisation = true; double initialValue = 0.0; pEnergyMap = new ArrayGrid<double>( width, height, needsInitialisation, initialValue ); int nrOrientations = mpPyramid->GetNumberOfOrientations(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { double tmpValue = 0.0; for (int i = 0; i < nrOrientations-1; i++) { for (int j = i+1; j < nrOrientations; j++) { if ( ( abs( i - j ) > 1 ) && ( abs( i - j%(nrOrientations-1) ) > 0) ) { tmpValue += ( abs( pPyrLevel->GetOrientedBand( i )->GetValue(x, y) ) * abs( pPyrLevel->GetOrientedBand( j )->GetValue(x, y) ) ); } } } pEnergyMap->SetValue( x, y, tmpValue); } } if (scale > 0) { pUpscaledEnergyMap = GaussConvolve::UpsampleGaussianInterpolated( pEnergyMap, MathUtils::ComputeIntegerPower(2, scale ) ); delete pEnergyMap; } else { pUpscaledEnergyMap = pEnergyMap; } mvEnergyMaps.push_back( pUpscaledEnergyMap ); return true; }