o
    *j+                     @   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_RECTZmorphologyExZMORPH_CLOSEget_max_inner_rect"IMAGE_BLENDER_VALID_MASK_THRESHOLD IMAGE_BLENDER_MIN_VALID_SKY_AREA	Exception
scale_rect)Zin_sky_imageZin_sky_maskscaleZresize_maskrowscolsheight_scaleZwidth_scalenew_sizeZ
kernelSizeelementZmax_inner_rectareaZraw_inner_rectZout_sky_image r'   o/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/image_skychange/skychange.pyextract_sky_image   sP   r)   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cudaZis_availablecpunumpyr   r   r)   blend_merge)Zscene_image
scene_maskZ	sky_imagesky_maskinBlendLevelNumZsky_image_hZsky_image_wZ
sky_mask_hZ
sky_mask_wZscene_image_hZscene_image_wZscene_mask_hZscene_mask_wvalid_sky_imageout_blend_imager'   r'   r(   blendC   s,   

r4   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)Zin_image_maskZin_alpha_thresholdZis_bigger_validresrowcolZi0Zj0i1Zj1heightisjcur_h_wZcurAreaout_rectr'   r'   r(   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_rectZin_image_sizeZin_scaleZtlXZtlYZin_image_size_hZin_image_size_wZbrXZbrYrE   r'   r'   r(   r      s   r   c                 C   s(   | |k} t | tj}t |}|S )N)r   ZfindNonZeroastypenpuint8ZboundingRect)Zin_maskZin_threshold	locationsZoutput_rectr'   r'   r(   get_fast_valid_rect   s   
rL   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_imageZin_min_sizetypeZresize_imagewidthr>   Zresize_img_heightZresize_img_widthr#   Zwidht_scaler    r$   r'   r'   r(   min_size_match   s   rP   c           	      C   sZ   |\}}| j dd \}}|| d }|| d }|  }|||| ||| f }|S )Nr   r   )r   r   )	rM   Zin_sizeZ	in_size_wZ	in_size_hZ
in_image_hZ
in_image_wZhalf_heightZ
half_widthZout_crop_imager'   r'   r(   center_crop   s   
rQ   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   )Zin_pad_imagerG   Zout_base_imageZ	in_rect_xZ	in_rect_yZ	in_rect_wZ	in_rect_hr'   r'   r(   safe_roi_pad   s    
rR   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   )Zaxisg     o@r      rJ   )
r   r   r   rI   Zfloat32repeatZnewaxisZcliprH   rR   )Zin_base_imageZin_merge_imageZin_merge_maskZin_pointZ
in_point_xZ
in_point_yZin_merge_image_rowsZin_merge_image_colsZin_base_image_rowsZin_base_image_colsZbase_roi_imagemerge_imageZmerge_alphaZroi_rectr'   r'   r(   rU      sB   
$
rU   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   rS   r5   )r   r   rJ   )Zdtype)!rL   r   r   rP   rQ   r   r   r   IMAGE_BLENDER_MASK_RESIZE_SCALEIMAGE_BLENDER_MIN_RESIZE_DIMr   r   r   ZblurIMAGE_BLENDER_BLUR_KERNEL_SIZEr   r   ZdilateZeroder   rU   r9   rH   rI   rJ   Zdetail_MultiBandBlenderpreparer6   r7   feedZonesZ
zeros_liker4   )Zin_scene_imageZin_scene_maskZin_valid_sky_imager1   Zscene_sky_rectr&   r2   Zsky_sizeZresize_scene_maskr%   r0   r/   xywhZvalid_sky_maskZpano_sky_imageZblend_imagesZblend_masksZpanorama_rectZblenderr?   Z	pano_maskr3   resultr'   r'   r(   r.      sz   
  



r.   )r	   )r   )r
   )*numbersosZpdbcollectionsr   r   jsonr-   rI   r*   Ztorch.nn.functionalnnZ
functionalFZPILr   Ztorchvisionr   backendsZcudnnenabledZIMAGE_MAX_DIMZIMAGE_MIN_DIMZIMAGE_MAX_RATIOrV   r   r   r   r   rW   rX   r)   r4   r   r   rL   r   rP   rQ   rR   rU   r.   r'   r'   r'   r(   <module>   sB   

&*

'