diff --git a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx index 3c928ac0090437b436d0c2dca32c7d1bdfb2ae34..1e4a84d465636cf89b5f9011d1b6c8fbe73cf44a 100644 --- a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx +++ b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx @@ -370,18 +370,15 @@ private: region.SetSize(1, GetParameterInt("sizey")); region.SetIndex(0, GetParameterInt("startx")); region.SetIndex(1, GetParameterInt("starty")); - if ( HasValue("in") ) + ImageType* inImage = GetParameterImage("in"); + inImage->UpdateOutputInformation(); + if (region.Crop(inImage->GetLargestPossibleRegion())) { - ImageType* inImage = GetParameterImage("in"); - inImage->UpdateOutputInformation(); - if (region.Crop(inImage->GetLargestPossibleRegion())) - { - SetParameterInt("sizex",region.GetSize(0)); - SetParameterInt("sizey",region.GetSize(1)); - SetParameterInt("startx",region.GetIndex(0)); - SetParameterInt("starty",region.GetIndex(1)); - return true; - } + SetParameterInt("sizex",region.GetSize(0)); + SetParameterInt("sizey",region.GetSize(1)); + SetParameterInt("startx",region.GetIndex(0)); + SetParameterInt("starty",region.GetIndex(1)); + return true; } return false; } @@ -391,18 +388,13 @@ private: { assert( GetParameterString( "mode" ) == "extent" ); // Compute standard parameter depending on the unit chosen by the user + FloatVectorImageType::IndexType uli , lri; if (GetParameterString( "mode.extent.unit" ) == "pxl" ) { - int pixelValue = std::round( GetParameterFloat( "mode.extent.ulx" ) ); - SetParameterInt( "startx", pixelValue); - pixelValue = std::round( GetParameterFloat( "mode.extent.lrx" ) - - pixelValue ) + 1 ; - SetParameterInt( "sizex", pixelValue); - pixelValue = std::round( GetParameterFloat( "mode.extent.uly" ) ); - SetParameterInt( "starty", pixelValue); - pixelValue = std::round( GetParameterFloat( "mode.extent.lry" ) - - pixelValue ) + 1 ; - SetParameterInt( "sizey", pixelValue); + uli[0] = std::round( GetParameterFloat( "mode.extent.ulx" ) ); + uli[1] = std::round( GetParameterFloat( "mode.extent.uly" ) ); + lri[0] = std::round( GetParameterFloat( "mode.extent.lrx" ) ); + lri[1] = std::round( GetParameterFloat( "mode.extent.lry" ) ); } else if( GetParameterString( "mode.extent.unit" ) == "phy" ) { @@ -411,18 +403,9 @@ private: ulp[ 1 ] = GetParameterFloat( "mode.extent.uly" ); lrp[ 0 ] = GetParameterFloat( "mode.extent.lrx" ); lrp[ 1 ] = GetParameterFloat( "mode.extent.lry" ); - ImageType * inImage = GetParameterImage("in"); - FloatVectorImageType::IndexType uli , lri; inImage->TransformPhysicalPointToIndex(ulp,uli); - inImage->TransformPhysicalPointToIndex(lrp,lri); - - SetParameterInt( "startx", uli[0]); - SetParameterInt( "starty", uli[1]); - - SetParameterInt( "sizex", lri[0] - uli[0] + 1); - SetParameterInt( "sizey", lri[1] - uli[1] + 1); - + inImage->TransformPhysicalPointToIndex(lrp,lri); } else // if( GetParameterString( "mode.extent.unit" ) == "lonlat" ) { @@ -438,17 +421,13 @@ private: lrp_in[ 1 ] = GetParameterFloat( "mode.extent.lry" ); ulp_out = rsTransform->TransformPoint(ulp_in); lrp_out = rsTransform->TransformPoint(lrp_in); - - FloatVectorImageType::IndexType uli_out , lri_out; - inImage->TransformPhysicalPointToIndex(ulp_out,uli_out); - inImage->TransformPhysicalPointToIndex(lrp_out,lri_out); - - SetParameterInt( "startx", uli_out[0]); - SetParameterInt( "starty", uli_out[1]); - - SetParameterInt( "sizex", lri_out[0] - uli_out[0] + 1); - SetParameterInt( "sizey", lri_out[1] - uli_out[1] + 1); + inImage->TransformPhysicalPointToIndex(ulp_out,uli); + inImage->TransformPhysicalPointToIndex(lrp_out,lri); } + SetParameterInt( "startx", uli[0]); + SetParameterInt( "starty", uli[1]); + SetParameterInt( "sizex", lri[0] - uli[0] + 1); + SetParameterInt( "sizey", lri[1] - uli[1] + 1); } void @@ -512,18 +491,16 @@ private: void ComputeIndexFromRadius() { - int pixelValue = -1; + FloatVectorImageType::SizeType radiusi ; assert( GetParameterString( "mode" ) == "radius" ); - // First compute sizex sizey thanks to the radius if ( HasValue( "mode.radius.r" ) ) { if ( GetParameterString( "mode.radius.unitr" ) == "pxl" ) { - pixelValue = std::floor( 2 * GetParameterFloat( "mode.radius.r" ) ) + 1; - SetParameterInt( "sizey", pixelValue); - SetParameterInt( "sizex", pixelValue); + radiusi[0] = std::floor( GetParameterFloat( "mode.radius.r" ) ); + radiusi[1] = std::floor( GetParameterFloat( "mode.radius.r" ) ); } - if ( GetParameterString( "mode.radius.unitr" ) == "phy" ) + else //if ( GetParameterString( "mode.radius.unitr" ) == "phy" ) { ImageType * inImage = GetParameterImage("in"); itk::Point<float, 2> radxp , radyp , ulp ; @@ -536,47 +513,24 @@ private: radyp[1] += GetParameterFloat( "mode.radius.r" ); bool lgtx = inImage->TransformPhysicalPointToIndex( radxp , radxi ); bool lgty = inImage->TransformPhysicalPointToIndex( radyp , radyi ); - FloatVectorImageType::IndexValueType maxR = - std::min( inImage->GetLargestPossibleRegion().GetSize()[0] , - inImage->GetLargestPossibleRegion().GetSize()[1] ); - maxR = maxR / 2 - ( (maxR + 1) % 2 ); - if ( lgtx && lgty) - { - pixelValue = std::max( radxi[0] , radyi[1] ); - if ( maxR<pixelValue ) - { - pixelValue = std::min( std::min( radxi[0] , radyi[1] ) , maxR ); - } - } - else if ( lgtx ) - { - pixelValue = std::min( radxi[0] , maxR ); - } - else if ( lgty ) - { - pixelValue = std::min( radyi[1] , maxR ); - } + if ( lgtx ) + radiusi[0] = radxp[0]; else - { - pixelValue = maxR; - } - SetParameterInt( "sizey", 2 * pixelValue + 1); - SetParameterInt( "sizex", 2 * pixelValue + 1); + radiusi[0] = GetDefaultParameterInt( "sizex"); + if ( lgty ) + radiusi[1] = radyp[1]; + else + radiusi[1] = GetDefaultParameterInt( "sizey"); } } - - // Then compute startx and starty + FloatVectorImageType::IndexType centeri ; + bool isIn(true); if ( HasValue("sizex") && HasValue("sizey") ) { - int radiusxi = GetParameterInt("sizex") / 2 ; - int radiusyi = GetParameterInt("sizey") / 2 ; - if ( GetParameterString( "mode.radius.unitc" ) == "pxl" ) { - pixelValue = std::round(GetParameterFloat( "mode.radius.cx" )); - SetParameterInt( "startx", pixelValue - radiusxi); - pixelValue = std::round(GetParameterFloat( "mode.radius.cy" )); - SetParameterInt( "starty", pixelValue - radiusyi); + centeri[0] = std::round(GetParameterFloat( "mode.radius.cx" )); + centeri[1] = std::round(GetParameterFloat( "mode.radius.cy" )); } else if ( GetParameterString( "mode.radius.unitc" ) == "phy" ) { @@ -584,13 +538,7 @@ private: itk::Point<float, 2> centerp; centerp[ 0 ] = GetParameterFloat( "mode.radius.cx" ); centerp[ 1 ] = GetParameterFloat( "mode.radius.cy" ); - FloatVectorImageType::IndexType centeri ; - bool isIn = inImage->TransformPhysicalPointToIndex( centerp , centeri ); - if ( isIn ) - { - SetParameterInt( "startx", centeri[0] - radiusxi); - SetParameterInt( "starty", centeri[1] - radiusyi); - } + isIn = inImage->TransformPhysicalPointToIndex( centerp , centeri ); } else // if ( GetParameterString( "mode.radius.unitc" ) == "lonlat" ) { @@ -603,16 +551,21 @@ private: centerp_in[ 0 ] = GetParameterFloat( "mode.radius.cx" ); centerp_in[ 1 ] = GetParameterFloat( "mode.radius.cy" ); centerp_out = rsTransform->TransformPoint(centerp_in); - FloatVectorImageType::IndexType centeri_out; - bool isIn = inImage->TransformPhysicalPointToIndex( centerp_out , - centeri_out ); - if ( isIn ) - { - SetParameterInt( "startx", centeri_out[0] - radiusxi); - SetParameterInt( "starty", centeri_out[1] - radiusyi); - } + isIn = inImage->TransformPhysicalPointToIndex( centerp_out , + centeri ); } } + if ( isIn ) + { + SetParameterInt( "startx", centeri[0] - radiusi[0]); + SetParameterInt( "sizex", centeri[0] + radiusi[0] + 1 ); + SetParameterInt( "starty", centeri[1] - radiusi[1]); + SetParameterInt( "sizey", centeri[1] + radiusi[1] + 1 ); + } + else + { + // log + } } void @@ -833,7 +786,9 @@ private: } - CropRegionOfInterest(); + if ( !CropRegionOfInterest() ) + otbAppLogFATAL(<<"Could not extract the ROI as it is out of the " + "input image."); ExtractROIFilterType::Pointer extractROIFilter = ExtractROIFilterType::New(); extractROIFilter->SetInput(inImage);