<s> import math <EOL> import numpy <EOL> import time <EOL> interpolation_methods = [ '<STR_LIT>' ] <EOL> def use ( pkgname ) : <EOL> global have_opencv , cv2 , cv2_resize <EOL> if pkgname == '<STR_LIT>' : <EOL> import cv2 <EOL> have_opencv = True <EOL> cv2_resize = { <EOL> '<STR_LIT>' : cv2 . INTER_NEAREST , <EOL> '<STR_LIT>' : cv2 . INTER_LINEAR , <EOL> '<STR_LIT>' : cv2 . INTER_AREA , <EOL> '<STR_LIT>' : cv2 . INTER_CUBIC , <EOL> '<STR_LIT>' : cv2 . INTER_LANCZOS4 , <EOL> } <EOL> if not '<STR_LIT>' in interpolation_methods : <EOL> interpolation_methods . extend ( cv2_resize . keys ( ) ) <EOL> interpolation_methods . sort ( ) <EOL> have_opencv = False <EOL> try : <EOL> pass <EOL> except ImportError : <EOL> pass <EOL> have_numexpr = False <EOL> try : <EOL> import numexpr as ne <EOL> have_numexpr = True <EOL> except ImportError : <EOL> pass <EOL> def get_center ( data_np ) : <EOL> ht , wd = data_np . shape [ : <NUM_LIT:2> ] <EOL> ctr_x = wd // <NUM_LIT:2> <EOL> ctr_y = ht // <NUM_LIT:2> <EOL> return ( ctr_x , ctr_y ) <EOL> def rotate_pt ( x_arr , y_arr , theta_deg , xoff = <NUM_LIT:0> , yoff = <NUM_LIT:0> ) : <EOL> """<STR_LIT>""" <EOL> a_arr = x_arr - xoff <EOL> b_arr = y_arr - yoff <EOL> cos_t = numpy . cos ( numpy . radians ( theta_deg ) ) <EOL> sin_t = numpy . sin ( numpy . radians ( theta_deg ) ) <EOL> ap = ( a_arr * cos_t ) - ( b_arr * sin_t ) <EOL> bp = ( a_arr * sin_t ) + ( b_arr * cos_t ) <EOL> return ( ap + xoff , bp + yoff ) <EOL> rotate_arr = rotate_pt <EOL> def rotate_clip ( data_np , theta_deg , rotctr_x = None , rotctr_y = None , <EOL> out = None ) : <EOL> """<STR_LIT>""" <EOL> if math . fmod ( theta_deg , <NUM_LIT> ) == <NUM_LIT:0.0> : <EOL> return data_np <EOL> ht , wd = data_np . shape [ : <NUM_LIT:2> ] <EOL> if rotctr_x is None : <EOL> rotctr_x = wd // <NUM_LIT:2> <EOL> if rotctr_y is None : <EOL> rotctr_y = ht // <NUM_LIT:2> <EOL> if have_opencv : <EOL> M = cv2 . getRotationMatrix2D ( ( rotctr_y , rotctr_x ) , theta_deg , <NUM_LIT:1> ) <EOL> if out is not None : <EOL> out [ : , : , ... ] = cv2 . warpAffine ( data_np , M , ( wd , ht ) ) <EOL> newdata = out <EOL> else : <EOL> newdata = cv2 . warpAffine ( data_np , M , ( wd , ht ) ) <EOL> new_ht , new_wd = newdata . shape [ : <NUM_LIT:2> ] <EOL> assert ( wd == new_wd ) and ( ht == new_ht ) , Exception ( "<STR_LIT>" % ( <EOL> new_wd , new_ht , wd , ht ) ) <EOL> else : <EOL> yi , xi = numpy . mgrid [ <NUM_LIT:0> : ht , <NUM_LIT:0> : wd ] <EOL> xi -= rotctr_x <EOL> yi -= rotctr_y <EOL> cos_t = numpy . cos ( numpy . radians ( theta_deg ) ) <EOL> sin_t = numpy . sin ( numpy . radians ( theta_deg ) ) <EOL> if have_numexpr : <EOL> ap = ne . evaluate ( "<STR_LIT>" ) <EOL> bp = ne . evaluate ( "<STR_LIT>" ) <EOL> else : <EOL> ap = ( xi * cos_t ) - ( yi * sin_t ) + rotctr_x <EOL> bp = ( xi * sin_t ) + ( yi * cos_t ) + rotctr_y <EOL> numpy . rint ( ap , out = ap ) <EOL> ap = ap . astype ( '<STR_LIT:int>' ) <EOL> ap . clip ( <NUM_LIT:0> , wd - <NUM_LIT:1> , out = ap ) <EOL> numpy . rint ( bp , out = bp ) <EOL> bp = bp . astype ( '<STR_LIT:int>' ) <EOL> bp . clip ( <NUM_LIT:0> , ht - <NUM_LIT:1> , out = bp ) <EOL> if out is not None : <EOL> out [ : , : , ... ] = data_np [ bp , ap ] <EOL> newdata = out <EOL> else : <EOL> newdata = data_np [ bp , ap ] <EOL> new_ht , new_wd = newdata . shape [ : <NUM_LIT:2> ] <EOL> assert ( wd == new_wd ) and ( ht == new_ht ) , Exception ( "<STR_LIT>" % ( <EOL> new_wd , new_ht , wd , ht ) ) <EOL> return newdata <EOL> def rotate ( data_np , theta_deg , rotctr_x = None , rotctr_y = None ) : <EOL> if math . fmod ( theta_deg , <NUM_LIT> ) == <NUM_LIT:0.0> : <EOL> return data_np <EOL> ht , wd = data_np . shape [ : <NUM_LIT:2> ] <EOL> ocx , ocy = wd // <NUM_LIT:2> , ht // <NUM_LIT:2> <EOL> slop = <NUM_LIT:20> <EOL> side = int ( math . sqrt ( wd ** <NUM_LIT:2> + ht ** <NUM_LIT:2> ) + slop ) <EOL> new_wd = new_ht = side <EOL> dims = ( new_ht , new_wd ) + data_np . shape [ <NUM_LIT:2> : ] <EOL> newdata = numpy . zeros ( dims ) <EOL> ncx , ncy = new_wd // <NUM_LIT:2> , new_ht // <NUM_LIT:2> <EOL> ldx , rdx = min ( ocx , ncx ) , min ( wd - ocx , ncx ) <EOL> bdy , tdy = min ( ocy , ncy ) , min ( ht - ocy , ncy ) <EOL> newdata [ ncy - bdy : ncy + tdy , ncx - ldx : ncx + rdx ] = data_np [ ocy - bdy : ocy + tdy , ocx - ldx : ocx + rdx ] <EOL> newdata = rotate_clip ( newdata , theta_deg , <EOL> rotctr_x = rotctr_x , rotctr_y = rotctr_y , <EOL> out = newdata ) <EOL> return newdata <EOL> def get_scaled_cutout_wdht_view ( shp , x1 , y1 , x2 , y2 , new_wd , new_ht ) : <EOL> """<STR_LIT>""" <EOL> old_wd = x2 - x1 + <NUM_LIT:1> <EOL> old_ht = y2 - y1 + <NUM_LIT:1> <EOL> if ( new_wd != old_wd ) or ( new_ht != old_ht ) : <EOL> yi = numpy . mgrid [ <NUM_LIT:0> : new_ht ] . reshape ( - <NUM_LIT:1> , <NUM_LIT:1> ) <EOL> xi = numpy . mgrid [ <NUM_LIT:0> : new_wd ] . reshape ( <NUM_LIT:1> , - <NUM_LIT:1> ) <EOL> iscale_x = float ( old_wd ) / float ( new_wd ) <EOL> iscale_y = float ( old_ht ) / float ( new_ht ) <EOL> xi = ( x1 + xi * iscale_x ) . clip ( x1 , x2 - <NUM_LIT:1> ) . astype ( '<STR_LIT:int>' ) <EOL> yi = ( y1 + yi * iscale_y ) . clip ( y1 , y2 - <NUM_LIT:1> ) . astype ( '<STR_LIT:int>' ) <EOL> wd , ht = xi . shape [ <NUM_LIT:1> ] , yi . shape [ <NUM_LIT:0> ] <EOL> xi_max , yi_max = xi [ <NUM_LIT:0> , - <NUM_LIT:1> ] , yi [ - <NUM_LIT:1> , <NUM_LIT:0> ] <EOL> assert xi_max <= shp [ <NUM_LIT:1> ] - <NUM_LIT:1> , ValueError ( "<STR_LIT>" % ( xi_max , shp [ <NUM_LIT:1> ] - <NUM_LIT:1> ) ) <EOL> assert yi_max <= shp [ <NUM_LIT:0> ] - <NUM_LIT:1> , ValueError ( "<STR_LIT>" % ( yi_max , shp [ <NUM_LIT:0> ] - <NUM_LIT:1> ) ) <EOL> view = numpy . s_ [ yi , xi ] <EOL> else : <EOL> view = numpy . s_ [ y1 : y2 + <NUM_LIT:1> , x1 : x2 + <NUM_LIT:1> ] <EOL> wd , ht = old_wd , old_ht <EOL> old_wd , old_ht = max ( old_wd , <NUM_LIT:1> ) , max ( old_ht , <NUM_LIT:1> ) <EOL> scale_x = float ( wd ) / old_wd <EOL> scale_y = float ( ht ) / old_ht <EOL> return ( view , ( scale_x , scale_y ) ) <EOL> def get_scaled_cutout_wdht ( data_np , x1 , y1 , x2 , y2 , new_wd , new_ht , <EOL> interpolation = '<STR_LIT>' ) : <EOL> if have_opencv and ( interpolation != '<STR_LIT>' ) : <EOL> method = cv2_resize [ interpolation ] <EOL> newdata = cv2 . resize ( data_np [ y1 : y2 + <NUM_LIT:1> , x1 : x2 + <NUM_LIT:1> ] , ( new_wd , new_ht ) , <EOL> interpolation = method ) <EOL> old_wd , old_ht = max ( x2 - x1 + <NUM_LIT:1> , <NUM_LIT:1> ) , max ( y2 - y1 + <NUM_LIT:1> , <NUM_LIT:1> ) <EOL> ht , wd = newdata . shape [ : <NUM_LIT:2> ] <EOL> scale_x , scale_y = float ( wd ) / old_wd , float ( ht ) / old_ht <EOL> else : <EOL> view , ( scale_x , scale_y ) = get_scaled_cutout_wdht_view ( data_np . shape , <EOL> x1 , y1 , x2 , y2 , <EOL> new_wd , new_ht ) <EOL> new_data = data_np [ view ] <EOL> return new_data , ( scale_x , scale_y ) <EOL> def get_scaled_cutout_basic_view ( shp , x1 , y1 , x2 , y2 , scale_x , scale_y ) : <EOL> """<STR_LIT>""" <EOL> old_wd = x2 - x1 + <NUM_LIT:1> <EOL> old_ht = y2 - y1 + <NUM_LIT:1> <EOL> new_wd = int ( round ( scale_x * old_wd ) ) <EOL> new_ht = int ( round ( scale_y * old_ht ) ) <EOL> return get_scaled_cutout_wdht_view ( shp , x1 , y1 , x2 , y2 , new_wd , new_ht ) <EOL> def get_scaled_cutout_basic ( data_np , x1 , y1 , x2 , y2 , scale_x , scale_y , <EOL> interpolation = '<STR_LIT>' ) : <EOL> if have_opencv and ( interpolation != '<STR_LIT>' ) : <EOL> method = cv2_resize [ interpolation ] <EOL> newdata = cv2 . resize ( data_np [ y1 : y2 + <NUM_LIT:1> , x1 : x2 + <NUM_LIT:1> ] , None , <EOL> fx = scale_x , fy = scale_y , <EOL> interpolation = method ) <EOL> old_wd , old_ht = max ( x2 - x1 + <NUM_LIT:1> , <NUM_LIT:1> ) , max ( y2 - y1 + <NUM_LIT:1> , <NUM_LIT:1> ) <EOL> ht , wd = newdata . shape [ : <NUM_LIT:2> ] <EOL> scale_x , scale_y = float ( wd ) / old_wd , float ( ht ) / old_ht <EOL> elif interpolation != '<STR_LIT>' : <EOL> raise ValueError ( "<STR_LIT>" % ( <EOL> interpolation ) ) <EOL> else : <EOL> view , ( scale_x , scale_y ) = get_scaled_cutout_basic_view ( data_np . shape , <EOL> x1 , y1 , x2 , y2 , <EOL> scale_x , scale_y ) <EOL> newdata = data_np [ view ] <EOL> return newdata , ( scale_x , scale_y ) <EOL> def transform ( data_np , flip_x = False , flip_y = False , swap_xy = False ) : <EOL> if flip_y : <EOL> data_np = numpy . flipud ( data_np ) <EOL> if flip_x : <EOL> data_np = numpy . fliplr ( data_np ) <EOL> if swap_xy : <EOL> data_np = data_np . swapaxes ( <NUM_LIT:0> , <NUM_LIT:1> ) <EOL> return data_np <EOL> def calc_image_merge_clip ( x1 , y1 , x2 , y2 , <EOL> dst_x , dst_y , a1 , b1 , a2 , b2 ) : <EOL> """<STR_LIT>""" <EOL> src_wd , src_ht = a2 - a1 , b2 - b1 <EOL> ex = y1 - dst_y <EOL> if ex > <NUM_LIT:0> : <EOL> src_ht -= ex <EOL> dst_y += ex <EOL> b1 += ex <EOL> ex = x1 - dst_x <EOL> if ex > <NUM_LIT:0> : <EOL> src_wd -= ex <EOL> dst_x += ex <EOL> a1 += ex <EOL> ex = dst_y + src_ht - y2 <EOL> if ex > <NUM_LIT:0> : <EOL> src_ht -= ex <EOL> b2 -= ex <EOL> ex = dst_x + src_wd - x2 <EOL> if ex > <NUM_LIT:0> : <EOL> src_wd -= ex <EOL> a2 -= ex <EOL> return ( dst_x , dst_y , a1 , b1 , a2 , b2 ) <EOL> def overlay_image ( dstarr , dst_x , dst_y , srcarr , dst_order = '<STR_LIT>' , <EOL> src_order = '<STR_LIT>' , <EOL> alpha = <NUM_LIT:1.0> , copy = False , fill = True , flipy = False ) : <EOL> dst_ht , dst_wd , dst_dp = dstarr . shape <EOL> src_ht , src_wd , src_dp = srcarr . shape <EOL> if flipy : <EOL> srcarr = numpy . flipud ( srcarr ) <EOL> if dst_y < <NUM_LIT:0> : <EOL> dy = abs ( dst_y ) <EOL> srcarr = srcarr [ dy : , : , : ] <EOL> src_ht -= dy <EOL> dst_y = <NUM_LIT:0> <EOL> if dst_x < <NUM_LIT:0> : <EOL> dx = abs ( dst_x ) <EOL> srcarr = srcarr [ : , dx : , : ] <EOL> src_wd -= dx <EOL> dst_x = <NUM_LIT:0> <EOL> if src_wd <= <NUM_LIT:0> or src_ht <= <NUM_LIT:0> : <EOL> return dstarr <EOL> ex = dst_y + src_ht - dst_ht <EOL> if ex > <NUM_LIT:0> : <EOL> srcarr = srcarr [ : dst_ht , : , : ] <EOL> src_ht -= ex <EOL> ex = dst_x + src_wd - dst_wd <EOL> if ex > <NUM_LIT:0> : <EOL> srcarr = srcarr [ : , : dst_wd , : ] <EOL> src_wd -= ex <EOL> if copy : <EOL> dstarr = numpy . copy ( dstarr , order = '<STR_LIT:C>' ) <EOL> da_idx = - <NUM_LIT:1> <EOL> if '<STR_LIT:A>' in dst_order : <EOL> da_idx = dst_order . index ( '<STR_LIT:A>' ) <EOL> assert da_idx == <NUM_LIT:3> , ValueError ( "<STR_LIT>" ) <EOL> if fill and ( da_idx >= <NUM_LIT:0> ) : <EOL> dstarr [ dst_y : dst_y + src_ht , dst_x : dst_x + src_wd , da_idx ] = <NUM_LIT:255> <EOL> if src_dp > <NUM_LIT:3> : <EOL> sa_idx = src_order . index ( '<STR_LIT:A>' ) <EOL> alpha = srcarr [ <NUM_LIT:0> : src_ht , <NUM_LIT:0> : src_wd , sa_idx ] / <NUM_LIT> <EOL> alpha = numpy . dstack ( ( alpha , alpha , alpha ) ) <EOL> get_order = dst_order <EOL> if ( '<STR_LIT:A>' in dst_order ) and not ( '<STR_LIT:A>' in src_order ) : <EOL> get_order = dst_order . replace ( '<STR_LIT:A>' , '<STR_LIT>' ) <EOL> if get_order != src_order : <EOL> srcarr = reorder_image ( get_order , srcarr , src_order ) <EOL> a_arr = ( alpha * srcarr [ <NUM_LIT:0> : src_ht , <NUM_LIT:0> : src_wd , <NUM_LIT:0> : <NUM_LIT:3> ] ) . astype ( numpy . uint8 ) <EOL> b_arr = ( ( <NUM_LIT:1.0> - alpha ) * dstarr [ dst_y : dst_y + src_ht , <EOL> dst_x : dst_x + src_wd , <EOL> <NUM_LIT:0> : <NUM_LIT:3> ] ) . astype ( numpy . uint8 ) <EOL> dstarr [ dst_y : dst_y + src_ht , dst_x : dst_x + src_wd , <NUM_LIT:0> : <NUM_LIT:3> ] = a_arr [ <NUM_LIT:0> : src_ht , <NUM_LIT:0> : src_wd , <NUM_LIT:0> : <NUM_LIT:3> ] + b_arr [ <NUM_LIT:0> : src_ht , <NUM_LIT:0> : src_wd , <NUM_LIT:0> : <NUM_LIT:3> ] <EOL> return dstarr <EOL> def reorder_image ( dst_order , src_arr , src_order ) : <EOL> indexes = [ src_order . index ( c ) for c in dst_order ] <EOL> return numpy . dstack ( [ src_arr [ ... , idx ] for idx in indexes ] ) </s>
