public static List < LineParametric2D_F32 > pruneSimilarLines ( List < LineParametric2D_F32 > lines , float intensity [ ] , float toleranceAngle , float toleranceDist , int imgWidth , int imgHeight ) { int indexSort [ ] = new int [ intensity . length ] ; QuickSort_F32 sort = new QuickSort_F32 ( ) ; sort . sort ( intensity , 0 , lines . size ( ) , indexSort ) ; float theta [ ] = new float [ lines . size ( ) ] ; List < LineSegment2D_F32 > segments = new ArrayList <> ( lines . size ( ) ) ; for ( int i = 0 ; i < lines . size ( ) ; i ++ ) { LineParametric2D_F32 l = lines . get ( i ) ; theta [ i ] = UtilAngle . atanSafe ( l . getSlopeY ( ) , l . getSlopeX ( ) ) ; segments . add ( convert ( l , imgWidth , imgHeight ) ) ; } for ( int i = segments . size ( ) - 1 ; i >= 0 ; i -- ) { LineSegment2D_F32 a = segments . get ( indexSort [ i ] ) ; if ( a == null ) continue ; for ( int j = i - 1 ; j >= 0 ; j -- ) { LineSegment2D_F32 b = segments . get ( indexSort [ j ] ) ; if ( b == null ) continue ; if ( UtilAngle . distHalf ( theta [ indexSort [ i ] ] , theta [ indexSort [ j ] ] ) > toleranceAngle ) continue ; Point2D_F32 p = Intersection2D_F32 . intersection ( a , b , null ) ; if ( p != null && p . x >= 0 && p . y >= 0 && p . x < imgWidth && p . y < imgHeight ) { segments . set ( indexSort [ j ] , null ) ; } else { float distA = Distance2D_F32 . distance ( a , b . a ) ; float distB = Distance2D_F32 . distance ( a , b . b ) ; if ( distA <= toleranceDist || distB < toleranceDist ) { segments . set ( indexSort [ j ] , null ) ; } } } } List < LineParametric2D_F32 > ret = new ArrayList <> ( ) ; for ( int i = 0 ; i < segments . size ( ) ; i ++ ) { if ( segments . get ( i ) != null ) { ret . add ( lines . get ( i ) ) ; } } return ret ; }
Prunes similar looking lines but keeps the lines with the most intensity .