o
    ߥi+                     @   s  d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlZd dl	Z	d dl
m  mZ d dlmZ d dlmZ de	jj_dZdZdZdZd	Zd
ZdZdZdZdZdd Zd"ddZ dd Z!dd Z"d#ddZ#ej$fddZ%dd Z&dd Z'dd Z(	d$d d!Z)dS )%    N)deque)Image)
transformsTi  2   g      $@      d   
      c                 C   s:  d}|  }|jdd \}}|tks|tkrEtt| }tt| }||kr)|n|}tt|| dtt|| df}t||tj}tdt|t	 d }	t
tj|	|	f}
t|tj|
}t|td\}}|tk rqtdd| }t|||}| |d |d |d  d |d |d |d  d f   }|S )	Ng      ?r                  ?Tz7[extractSkyImage]failed!! Valid sky region is too small)copyshape IMAGE_BLENDER_INNER_RECT_MAX_DIMfloatmaxintcv2resizeINTER_LINEAR IMAGE_BLENDER_DILATE_KERNEL_SIZEgetStructuringElement
MORPH_RECTmorphologyExMORPH_CLOSEget_max_inner_rect"IMAGE_BLENDER_VALID_MASK_THRESHOLD IMAGE_BLENDER_MIN_VALID_SKY_AREA	Exception
scale_rect)in_sky_imagein_sky_maskscaleresize_maskrowscolsheight_scalewidth_scalenew_size
kernelSizeelementmax_inner_rectarearaw_inner_rectout_sky_image r1   b/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/image_skychange/skychange.pyextract_sky_image   sP   r3   c                 C   s   t j r|   } |  }n|  } | }|jdd \}}|jdd \}}| jdd \}	}
|jdd \}}||ksF||krJtd|	|ksR|
|krVtdt||}t| |||}|S )Nr   r   zC[blend]failed!! sky_image shape not equal with sky_image_mask shapezG[blend]failed!! scene_image shape not equal with scene_image_mask shape)	torchcudais_availablecpunumpyr   r    r3   blend_merge)scene_image
scene_mask	sky_imagesky_maskinBlendLevelNumsky_image_hsky_image_w
sky_mask_h
sky_mask_wscene_image_hscene_image_wscene_mask_hscene_mask_wvalid_sky_imageout_blend_imager1   r1   r2   blendC   s,   

rI   c                 C   s  d}| j dd \}}d\}}}}	dg|d  }
td|D ]}t }td|d D ]}||k rV|rD| ||f |kr?|
| d nd|
|< n| ||f |krR|
| d nd|
|< t|dkr|
|d  |
| kr|d }|  |
| }t|dkrz|n||d  d }|| }||kr|}|}|| d }|d }	|	| d }t|dkr|
|d  |
| ksf|| q)q|||	| d || d f}||fS )Nr   r   )r   r   r   r   r   )r   ranger   lenpopappend)in_image_maskin_alpha_thresholdis_bigger_validresrowcoli0j0i1j1heightisjcur_h_wcurAreaout_rectr1   r1   r2   r   `   sP      

r   c           
      C   s   t | d | d }t | d | d }|jdd \}}tt | d | d |}tt | d | d |}|||| || f}	|	S )Nr   r   r   r   r   )r   r   min)
in_rectin_image_sizein_scaletlXtlYin_image_size_hin_image_size_wbrXbrYra   r1   r1   r2   r!      s   r!   c                 C   s(   | |k} t | tj}t |}|S )N)r   findNonZeroastypenpuint8boundingRect)in_maskin_threshold	locationsoutput_rectr1   r1   r2   get_fast_valid_rect   s   
ru   c                 C   s   |   }|\}}| jdd \}}|| }|| }	||	kr|n|	}
tt||
 d dtt||
 d df}t||dd|}|S )Nr   r   r   r   )r   r   r   r   r   r   )in_imagein_min_sizetyperesize_imagewidthrY   resize_img_heightresize_img_widthr(   widht_scaler$   r*   r1   r1   r2   min_size_match   s   r~   c           	      C   sZ   |\}}| j dd \}}|| d }|| d }|  }|||| ||| f }|S )Nr   r   )r   r   )	rv   in_size	in_size_w	in_size_h
in_image_h
in_image_whalf_height
half_widthout_crop_imager1   r1   r2   center_crop   s   
r   c                 C   s   |\}}}}|dk s|dk s|dks|dkrt d|| jd ks(|| jd kr,t d|| |jd ks>|| |jd krBt d| |||| ||| f< d S )Nr   z3[safe_roi_pad] Failed!! x,y,w,h of rect are illegalr   z[safe_roi_pad] Failed!!)r    r   )in_pad_imagerc   out_base_image	in_rect_x	in_rect_y	in_rect_w	in_rect_hr1   r1   r2   safe_roi_pad   s    
r   c                 C   s  |j dd |j dd krtd|\}}|j dd \}}| j dd \}}	|| |	ks4|| |kr8td| ||| ||| f }
| }| }t|
}
tj|d d d d tjf ddd}|d }d| |
 ||  }
t|
dd	}
|
d
}
||||f}t	|
||  | S )Nr   r   zD[merge_image] Failed!! in_merge_image.shape != in_merge_mask.shape!!z:[merge_image] Failed!! merge_image:image rect not in imager   )axisg     o@r      ro   )
r   r    r   rn   float32repeatnewaxiscliprm   r   )in_base_imagein_merge_imagein_merge_maskin_point
in_point_x
in_point_yin_merge_image_rowsin_merge_image_colsin_base_image_rowsin_base_image_colsbase_roi_imagemerge_imagemerge_alpharoi_rectr1   r1   r2   r      sB   
$
r   c                 C   s6  t |d}|d |d  }|tk rtdt||dd  }t||dd  }tt|jd t d t	tt|jd t d t	f}t
||t
j}t
|ttf}t
t
jttf}	t
||	}
t
||	}d| }t
|
|jdd d d d }
t
||jdd d d d }|\}}}}|
||| ||| f }|  }t||||dd }g }||  || g }||tj ||
tj dd| jd | jd f}t
d|}|| tdt|D ]}||| || d	 qtj| jd | jd fd
dd }t| }| ||}|d S )Nr   r   r   z@[blend_merge] Failed!! Scene Image Valid sky region is too smallr   r   r   rJ   )r   r   ro   )dtype)!ru   r   r    r~   r   r   r   r   IMAGE_BLENDER_MASK_RESIZE_SCALEIMAGE_BLENDER_MIN_RESIZE_DIMr   r   r   blurIMAGE_BLENDER_BLUR_KERNEL_SIZEr   r   dilateeroder   r   rN   rm   rn   ro   detail_MultiBandBlenderpreparerK   rL   feedones
zeros_likerI   )in_scene_imagein_scene_maskin_valid_sky_imager>   scene_sky_rectr.   rG   sky_sizeresize_scene_maskr,   r=   r;   xywhvalid_sky_maskpano_sky_imageblend_imagesblend_maskspanorama_rectblenderrZ   	pano_maskrH   resultr1   r1   r2   r9      sz   
  



r9   )r	   )r   )r
   )*numbersospdbcollectionsr   r   jsonr8   rn   r4   torch.nn.functionalnn
functionalFPILr   torchvisionr   backendscudnnenabledIMAGE_MAX_DIMIMAGE_MIN_DIMIMAGE_MAX_RATIOr   r   r   r   r   r   r   r3   rI   r   r!   ru   r   r~   r   r   r   r9   r1   r1   r1   r2   <module>   sB   

&*

'