void SlidingWindowFitAction::Perform(ArtifactSet &artifacts, class ProgressListener &listener) { LocalFitMethod method; switch(_parameters.method) { case SlidingWindowFitParameters::None: method.SetToNone(); break; case SlidingWindowFitParameters::Average: method.SetToAverage( _parameters.timeDirectionWindowSize, _parameters.frequencyDirectionWindowSize); break; case SlidingWindowFitParameters::GaussianWeightedAverage: method.SetToWeightedAverage( _parameters.timeDirectionWindowSize, _parameters.frequencyDirectionWindowSize, _parameters.timeDirectionKernelSize, _parameters.frequencyDirectionKernelSize); break; case SlidingWindowFitParameters::Median: method.SetToMedianFilter( _parameters.timeDirectionWindowSize, _parameters.frequencyDirectionWindowSize); break; case SlidingWindowFitParameters::Minimum: method.SetToMinimumFilter( _parameters.timeDirectionWindowSize, _parameters.frequencyDirectionWindowSize); break; } method.Initialize(artifacts.ContaminatedData()); size_t taskCount = method.TaskCount(); for(size_t i=0;i<taskCount;++i) { method.PerformFit(i); listener.OnProgress(*this, i+1, taskCount); } TimeFrequencyData newRevisedData = method.Background(); newRevisedData.SetMask(artifacts.RevisedData()); TimeFrequencyData *contaminatedData = TimeFrequencyData::CreateTFDataFromDiff(artifacts.ContaminatedData(), newRevisedData); contaminatedData->SetMask(artifacts.ContaminatedData()); artifacts.SetRevisedData(newRevisedData); artifacts.SetContaminatedData(*contaminatedData); delete contaminatedData; }
void SVDAction::Perform(ArtifactSet &artifacts, class ProgressListener &listener) { SVDMitigater mitigater; mitigater.Initialize(artifacts.ContaminatedData()); mitigater.SetRemoveCount(_singularValueCount); for(size_t i=0;i<mitigater.TaskCount();++i) { mitigater.PerformFit(i); listener.OnProgress(*this, i+1, mitigater.TaskCount()); } TimeFrequencyData newRevisedData = mitigater.Background(); newRevisedData.SetMask(artifacts.RevisedData()); TimeFrequencyData *contaminatedData = TimeFrequencyData::CreateTFDataFromDiff(artifacts.ContaminatedData(), newRevisedData); contaminatedData->SetMask(artifacts.ContaminatedData()); artifacts.SetRevisedData(newRevisedData); artifacts.SetContaminatedData(*contaminatedData); delete contaminatedData; }
void SpatialCompositionAction::Perform(ArtifactSet &artifacts, ProgressListener &progress) { size_t imageCount = artifacts.ContaminatedData().ImageCount(); std::vector<Image2DPtr> images(imageCount); for(size_t p=0;p<imageCount;++p) images[p] = Image2D::CreateZeroImagePtr(artifacts.ContaminatedData().ImageWidth(), artifacts.ContaminatedData().ImageHeight()); std::string filename = artifacts.ImageSet()->File(); SpatialMSImageSet set(filename); ImageSetIndex *index = set.StartIndex(); size_t progressStep = 0, totalProgress = artifacts.ContaminatedData().ImageWidth() * artifacts.ContaminatedData().ImageHeight()/256; while(index->IsValid()) { TimeFrequencyData *data = set.LoadData(*index); SpatialMatrixMetaData metaData(set.SpatialMetaData(*index)); for(size_t p=0;p!=imageCount;++p) { switch(_operation) { case SumCrossCorrelationsOperation: images[p]->SetValue(metaData.TimeIndex(), metaData.ChannelIndex(), sumCrossCorrelations(data->GetImage(p))); break; case SumAutoCorrelationsOperation: images[p]->SetValue(metaData.TimeIndex(), metaData.ChannelIndex(), sumAutoCorrelations(data->GetImage(p))); break; case EigenvalueDecompositionOperation: { num_t value = eigenvalue(data->GetImage(p), data->GetImage(p+1)); images[p]->SetValue(metaData.TimeIndex(), metaData.ChannelIndex(), value); images[p+1]->SetValue(metaData.TimeIndex(), metaData.ChannelIndex(), 0.0); ++p; } break; case EigenvalueRemovalOperation: { std::pair<num_t, num_t> value = removeEigenvalue(data->GetImage(p), data->GetImage(p+1)); images[p]->SetValue(metaData.TimeIndex(), metaData.ChannelIndex(), value.first); images[p+1]->SetValue(metaData.TimeIndex(), metaData.ChannelIndex(), value.second); ++p; } break; } } delete data; index->Next(); ++progressStep; progress.OnProgress(*this, progressStep/256, totalProgress); } delete index; TimeFrequencyData newRevisedData = artifacts.RevisedData(); for(size_t p=0;p<imageCount;++p) newRevisedData.SetImage(p, images[p]); newRevisedData.SetMask(artifacts.RevisedData()); TimeFrequencyData *contaminatedData = TimeFrequencyData::CreateTFDataFromDiff(artifacts.ContaminatedData(), newRevisedData); contaminatedData->SetMask(artifacts.ContaminatedData()); artifacts.SetRevisedData(newRevisedData); artifacts.SetContaminatedData(*contaminatedData); delete contaminatedData; }