18 #ifndef __otbSparseUnmixingImageFilter_txx
19 #define __otbSparseUnmixingImageFilter_txx
28 template <
class TInputImage,
class TOutputImage,
29 unsigned int VNbInputImage,
class TPrecision,
34 this->SetNumberOfRequiredInputs( NumberOfInputImages );
35 this->SetNumberOfOutputs(1);
36 this->SetNthOutput(0, OutputImageListType::New());
38 m_NumberOfComponentsRequired = 0;
39 m_NumberOfHistogramBins = 100;
40 m_AngleList = AngleListType::New();
42 m_WvltFilterList = WvltFilterListType::New();
43 m_WvltFilterList->Resize( NumberOfInputImages );
44 for (
unsigned int i = 0; i < NumberOfInputImages; ++i )
46 m_WvltFilterList->SetNthElement(i, WvltFilterType::New());
47 m_WvltFilterList->GetNthElement(i)->SetNumberOfDecompositions(2);
48 m_WvltFilterList->GetNthElement(i)->SetSubsampleImageFactor(1);
51 m_AngleListFilter = AngleListFilterType::New();
52 m_AngleListFilter->SetThresholdValue( 10. );
54 m_Histogram = HistogramType::New();
55 m_Transformer = TransformFilterType::New();
58 template <
class TInputImage,
class TOutputImage,
59 unsigned int VNbInputImage,
class TPrecision,
66 const_cast< InputImageType * >( img ) );
69 template <
class TInputImage,
class TOutputImage,
70 unsigned int VNbInputImage,
class TPrecision,
76 if ( i >= this->GetNumberOfInputs() )
85 template <
class TInputImage,
class TOutputImage,
86 unsigned int VNbInputImage,
class TPrecision,
93 progress->SetMiniPipelineFilter(
this);
95 for (
unsigned int i = 0; i < NumberOfInputImages; ++i )
97 m_WvltFilterList->GetNthElement(i)->SetInput( this->GetInput(i) );
98 progress->RegisterInternalFilter( m_WvltFilterList->GetNthElement(i),
99 0.5f/
static_cast<float>(NumberOfInputImages) );
100 m_WvltFilterList->GetNthElement(i)->Update();
102 m_AngleListFilter->SetInput( i, m_WvltFilterList->GetNthElement(i)->GetOutput() );
105 progress->RegisterInternalFilter(m_AngleListFilter, 0.25f);
106 m_AngleListFilter->Update();
108 GenerateNumberOfComponentsRequired();
111 for (
unsigned int i = 0; i < NumberOfInputImages; ++i )
112 m_Transformer->SetInput( i, this->GetInput(i) );
113 m_Transformer->SetAngleList( m_AngleList );
114 progress->RegisterInternalFilter(m_Transformer, 0.25f);
115 m_Transformer->Update();
117 this->GetOutput()->Resize( m_Transformer->GetOutput()->Size() );
118 for (
unsigned int i = 0; i < this->GetOutput()->Size(); ++i )
119 this->GetOutput()->SetNthElement( i, m_Transformer->GetOutput()->GetNthElement(i) );
122 template <
class TInputImage,
class TOutputImage,
123 unsigned int VNbInputImage,
class TPrecision,
135 size.
Fill( m_NumberOfHistogramBins );
139 m_Histogram->Initialize( size, theMin, theMax );
141 typename InternalSampleListType::Iterator angleIter
142 = m_AngleListFilter->GetOutputSampleList()->Begin();
144 if ( m_AngleListFilter->GetOutputSampleList()->Begin()
145 == m_AngleListFilter->GetOutputSampleList()->End() )
148 "The value of threshold is too high so that there is no angle value to consider for unmixing",
152 while ( angleIter != m_AngleListFilter->GetOutputSampleList()->End() )
154 if ( !m_Histogram->IncreaseFrequency( angleIter.GetMeasurementVector(), 1 ) )
155 std::cerr <<
"Data out of bounds\n";
161 for (
unsigned int index = 0; index < m_Histogram->GetSize()[0]; ++index )
162 std::cerr << index <<
"\t" << m_Histogram->GetMeasurementVector( index )[0]
163 <<
"\t" << m_Histogram->GetFrequency(index) <<
"\n";
168 for (
unsigned int id = 0;
id < m_Histogram->Size(); ++id )
173 bool isLocalMax =
true;
174 for (
unsigned int k = 0; k < m_Histogram->GetSize().GetSizeDimension(); ++k )
177 if ( prevIdx[k] == 0 )
178 prevIdx[k] = m_Histogram->GetSize(k)-1;
180 prevIdx[k] = curIdx[k]-1;
184 if ( static_cast<PrecisionType>( nextIdx[k] ) == m_Histogram->GetSize(k)-1 )
187 nextIdx[k] = curIdx[k]+1;
189 double freq_prev = m_Histogram->GetFrequency( prevIdx );
190 double freq_cur = m_Histogram->GetFrequency( curIdx );
191 double freq_next = m_Histogram->GetFrequency( nextIdx );
193 if ( !( freq_prev < freq_cur && freq_cur > freq_next ) )
202 angles->PushBack( m_Histogram->GetMeasurementVector( curIdx ) );
206 m_NumberOfComponentsRequired = angles->Size();
207 m_AngleList = angles;
210 std::cout << m_NumberOfComponentsRequired <<
" sources found\n";
211 for (
unsigned int i = 0; i < angles->Size(); i++ )
213 std::cerr <<
"Source " << i <<
":";
214 for (
unsigned int j = 0; j < m_Histogram->GetSize().GetSizeDimension(); ++j )
215 std::cout <<
"\t" << angles->GetMeasurementVector(i)[j];