diff --git a/Code/FeatureExtraction/otbTupinEdgeDetector.h b/Code/FeatureExtraction/otbTupinEdgeDetector.h index fbe41344fb9e4a5d5e0eff8fcb73a4b1fe5d9f36..3a5fd9d15203c0ef3dfd38cf7ba6602f3c52a173 100755 --- a/Code/FeatureExtraction/otbTupinEdgeDetector.h +++ b/Code/FeatureExtraction/otbTupinEdgeDetector.h @@ -22,6 +22,7 @@ (_xout) = (_x)*cos(_theta) - (_y)*sin(_theta); \ (_yout) = (_x)*sin(_theta) + (_y)*cos(_theta) + namespace otb { @@ -141,10 +142,10 @@ private: TupinEdgeDetector(const Self&); //purposely not implemented void operator=(const Self&); //purposely not implemented - /** Length of the linear feature*/ + /** Length of the linear feature = 2*m_LengthLine+1 */ unsigned int m_LengthLine; - /** Width of the linear feature*/ + /** Width of the linear feature = 2*m_WidthLine+1 */ unsigned int m_WidthLine; /** Radius of the region*/ diff --git a/Code/FeatureExtraction/otbTupinEdgeDetector.txx b/Code/FeatureExtraction/otbTupinEdgeDetector.txx index e5506c16ccefc07796f11b0e01670285796b6e1d..baaf1daeb46a4605a05ed1374586fc08f2881786 100755 --- a/Code/FeatureExtraction/otbTupinEdgeDetector.txx +++ b/Code/FeatureExtraction/otbTupinEdgeDetector.txx @@ -35,6 +35,9 @@ template <class TInputImage, class TOutputImage, class InterpolatorType > TupinEdgeDetector<TInputImage, TOutputImage, InterpolatorType>::TupinEdgeDetector() { m_Radius.Fill(1); + m_LengthLine = 1; + m_WidthLine = 0; + m_FaceList.Fill(0); m_Interpolator = InterpolatorType::New(); } @@ -111,14 +114,14 @@ void TupinEdgeDetector< TInputImage, TOutputImage, InterpolatorType> typename itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator<InputImageType>::FaceListType::iterator fit; // Define the size of the region by the radius - m_Radius[0] = static_cast<unsigned int>(0.5*( (3*m_WidthLine + 2) - 1 )); - m_Radius[1] = static_cast<unsigned int>(0.5*(m_LengthLine-1)); + m_Radius[0] = static_cast<unsigned int>(3*m_WidthLine + 2); + m_Radius[1] = m_LengthLine ; //std::cout <<"Radius " << m_Radius[0] << " " << m_Radius[1] << std::endl; // Define the size of the facelist by taking into account the rotation of the region - m_FaceList[0] = sqrt((m_Radius[0]*m_Radius[0])+ (m_Radius[1]*m_Radius[1])); + m_FaceList[0] = static_cast<unsigned int>( sqrt((m_Radius[0]*m_Radius[0])+ (m_Radius[1]*m_Radius[1]))+1 ); m_FaceList[1] = m_FaceList[0]; itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator<InputImageType> bC; @@ -147,7 +150,10 @@ void TupinEdgeDetector< TInputImage, TOutputImage, InterpolatorType> Theta[3] = 3*M_PI / 4. ; // Number of the zone - int zone; + unsigned int zone; + + // Pixel numbers in each zone + const int NbPixelZone = (2*m_WidthLine+1)*(2*m_LengthLine+1); // Contains for the 4 directions the sum of the pixels belonging to each zone double Sum[NB_DIR][NB_ZONE]; @@ -165,7 +171,7 @@ void TupinEdgeDetector< TInputImage, TOutputImage, InterpolatorType> // Pixel location in the input image int X, Y; - // Pixel location in the system axis of the region after rotation + // Pixel location after rotation in the system axis of the region double xout, yout; // Pixel location in the input image after rotation @@ -190,13 +196,11 @@ void TupinEdgeDetector< TInputImage, TOutputImage, InterpolatorType> bit.OverrideBoundaryCondition(&nbc); bit.GoToBegin(); - -//std::cout <<"***"<< neighborhoodSize << std::endl; while ( ! bit.IsAtEnd() ) { -std::cout << "Xc,Yc " << bit.GetIndex() << std::endl; +//std::cout << "Xc,Yc " << bit.GetIndex() << std::endl; // Initialisations for (int dir=0; dir<NB_DIR; dir++) @@ -213,22 +217,21 @@ std::cout << "Xc,Yc " << bit.GetIndex() << std::endl; Yc = bitIndex[1]; // Location of the central pixel between zone 1 and zone 2 - Xc12 = ( Xc - (m_WidthLine-1)/2 ) - 1 ; + Xc12 = Xc - m_WidthLine - 1; // Location of the central pixel between zone 1 and zone 3 - Xc13 = ( Xc + (m_WidthLine-1)/2 ) + 1 ; + Xc13 = Xc + m_WidthLine + 1; // Loop on the region for (i = 0; i < neighborhoodSize; ++i) { -std::cout << "---"<< i <<" "<< bit.GetIndex(i)<< std::endl; -std::cout << "val(X,Y) "<< static_cast<double>(bit.GetPixel(i)) << " " << std::endl; +//std::cout << "---"<< i <<" "<< bit.GetIndex(i)<< std::endl; +//std::cout << "val(X,Y) "<< static_cast<double>(bit.GetPixel(i)) << " " << std::endl; bitIndex = bit.GetIndex(i); X = bitIndex[0]; Y = bitIndex[1]; - -//std::cout << "---"<< i <<" "<< static_cast<double>(bit.GetPixel(i))<< std::endl; + // We determine in the vertical direction with which zone the pixel belongs. @@ -246,33 +249,29 @@ std::cout << "val(X,Y) "<< static_cast<double>(bit.GetPixel(i)) << " " << std::e { ROTATION( (X-Xc), (Y-Yc), Theta[dir], xout, yout); - // point[0] = double(xout + Xc); - // point[1] = double(yout + Yc); - Index[0] = static_cast<float>(xout + Xc); Index[1] = static_cast<float>(yout + Yc); -std::cout << "X' Y' "<< (xout + Xc) << " " << (yout + Yc) << std::endl; -std::cout << "val(X',Y') "<< static_cast<double>(m_Interpolator->Evaluate( point )) << std::endl; +//std::cout << "X' Y' "<< (xout + Xc) << " " << (yout + Yc) << std::endl; +//std::cout << "val(X',Y') "<< static_cast<double>(m_Interpolator->EvaluateAtContinuousIndex( Index )) << std::endl; - // Sum[dir][zone] += static_cast<double>(m_Interpolator->Evaluate( point )); Sum[dir][zone] += static_cast<double>(m_Interpolator->EvaluateAtContinuousIndex( Index )); - - + } - } // end of the loop on the pixels of the region - -//std::cout << static_cast<double>(Sum[0][0])/ double(WidthZone*HeightZone) << std::endl; + } // end of the loop on the pixels of the region + + R12 = -1.; + R13 = -1.; // Loop on the 4 directions for ( int dir=0; dir<NB_DIR; dir++ ) { - + // Calculation of the averages of the 3 zones - M1 = Sum[dir][0] / double(m_WidthLine*m_LengthLine); - M2 = Sum[dir][1] / double(m_WidthLine*m_LengthLine); - M3 = Sum[dir][2] / double(m_WidthLine*m_LengthLine); + M1 = Sum[dir][0] / static_cast<double>(NbPixelZone); + M2 = Sum[dir][1] / static_cast<double>(NbPixelZone); + M3 = Sum[dir][2] / static_cast<double>(NbPixelZone); // Calculation of the intensity of the linear feature if (( M1 != 0 ) && (M2 != 0)) @@ -284,23 +283,15 @@ std::cout << "val(X',Y') "<< static_cast<double>(m_Interpolator->Evaluate( point R13_theta[dir] = static_cast<double>( 1 - MIN( (M1/M3), (M3/M1) ) ); else R13_theta[dir] = 0.; + + // Determination of the maximum intensity of the linear feature + R12 = static_cast<double>( MAX( R12, R12_theta[dir] ) ); + R13 = static_cast<double>( MAX( R13, R13_theta[dir] ) ); } // end of the loop on the directions - // Determination of the maximum intensity of the linear feature - R12 = R12_theta[0]; - R13 = R13_theta[0]; - - for (int dir=1; dir<NB_DIR; dir++) - { - R12 = static_cast<double>( MAX( R12, R12_theta[dir] ) ); - R13 = static_cast<double>( MAX( R13, R13_theta[dir] ) ); - } - // Intensity of the linear feature R = MIN ( R12, R13 ); - -//std::cout << "R = " << R << std::endl; // Assignment of this value to the output pixel it.Set( static_cast<OutputPixelType>(R) );