a
    Ad5                     @   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m	Z	m
Z
 d dlmZ d dlmZmZ d dlmZmZ ddd	ZG d
d dejZdS )    N)Image	ImageDraw)images)	Processedprocess_images)optsstate   皙?c                 C   s  dd }dd }ddd}dd
d}| j d }| j d }	| j d }
| d d  d	|   tj|ddd }|dk}|dk }| d	||  }|t| }|t| | 7 }||}t|}|| }tjd}|||	dd}|||	|
f}tj|ddd }||9 }t|
D ],}|d d d d |f  d	| | 7  < q||}t|
D ]$}|d d d d |f  |9  < qLt	||}||}t|d d d d d d f d ||  | |d d d d d d f< d}| d d  |d	  |d  }t	||}|t
|8 }|t| }tjj||d d f d	 ||d d f dd||d d f< | d d  d	|  ||  }|d d  }t|dd	S )Nc                 S   s0  | j dkrtj| jd | jd | jd ftjd}t| jd D ]t}| d d d d |f }tjjtj|dd|d d d d |f< tj	|d d d d |f |d d d d |f< q@nttj| jd | jd ftjd}tjjtj| dd|d d d d f< tj	|d d d d f |d d d d f< |S N   r   r	   )dtypeortho)norm)
ndimnpzerosshape
complex128rangefftfft2fftshift	ifftshift)dataZout_fftcc_data r   @/var/www/html/stable-diffusion-webui/scripts/outpainting_mk_2.py_fft2   s    
(*4 (,z get_matched_noise.<locals>._fft2c                 S   s0  | j dkrtj| jd | jd | jd ftjd}t| jd D ]t}| d d d d |f }tjjtj|dd|d d d d |f< tj	|d d d d |f |d d d d |f< q@nttj| jd | jd ftjd}tjjtj| dd|d d d d f< tj	|d d d d f |d d d d f< |S r   )
r   r   r   r   r   r   r   ifft2r   r   )r   Zout_ifftr   r   r   r   r   _ifft2    s    
(*4 (,z!get_matched_noise.<locals>._ifft2Q	@r   c           
      S   s   t | t| | }t |t| | }t| |f}t| |  d d | }t|D ]z}|| d d | }	|dkrt|d |	d   | |d d |f< qTd|d d |	d d   |d  |d d |f< qT|S )N       @      ?r   r   r	   r"   )floatminr   r   aranger   exp)
widthheightstdmodeZwindow_scale_xZwindow_scale_ywindowxyfyr   r   r   _get_gaussian_window.   s    *2z/get_matched_noise.<locals>._get_gaussian_windowr$   c                 S   sr   t | jd | jd df}|dkr6| d d  | }n| d d  }tdD ]"}|d d  |d d d d |f< qJ|S )Nr   r	      r$   )r   r   r   r   )np_mask_greyZhardnessnp_mask_rgbZhardenedr   r   r   r   _get_masked_window_rgb=   s     z1get_matched_noise.<locals>._get_masked_window_rgbr	   r   )axisg      @gư>gMbP?r,           r#   )channel_axis)r"   r   )r$   )r   r   summaxaverageabsoluterandomdefault_rngr   realr&   skimageexposurematch_histogramsclip)Z_np_src_imager4   noise_qcolor_variationr   r!   r1   r5   r)   r*   num_channelsr3   img_maskZref_maskZwindowed_imageZsrc_fftZsrc_distZ	src_phaserngZnoise_windowZ	noise_rgbZ
noise_greyr   Z	noise_fftZshaped_noise_fftZbrightness_variationZcontrast_adjusted_np_srcZshaped_noiseZmatched_noiser   r   r   get_matched_noise   sN    






*"F:rJ   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Scriptc                 C   s   dS )NzOutpainting mk2r   )selfr   r   r   titlez   s    zScript.titlec                 C   s   |S )Nr   )rL   
is_img2imgr   r   r   show}   s    zScript.showc              	   C   s   |sd S t d}t jddddd| dd}t jdd	d
dd| dd}t jdg dg d| dd}t jddddd| dd}t jddddd| dd}||||||gS )Nz{<p style="margin-bottom:0.75em">Recommended settings: Sampling Steps: 80-100, Sampler: Euler a, Denoising strength: 0.8</p>zPixels to expand         pixels)labelminimummaximumstepvalueelem_idz	Mask blurr   @   r	   	mask_blurzOutpainting direction)leftrightupdown	direction)rT   choicesrX   rY   z'Fall-off exponent (lower=higher detail)r8   g      @g{Gz?r$   rE   zColor variationr
   rF   )grHTMLSliderrY   CheckboxGroup)rL   rN   inforS   r[   r`   rE   rF   r   r   r   ui   s    
 z	Script.uic                    sL  d d gj jd_d_d_d_d|v r8|nd}d|v rH|nd}	d|v rX|nd}
d|v rh|nd}|dks||	dkr|nd|
dks|dkr|ndd	 _d	 _jd }t	
|j | |	 d
 d
 }t	
|j|
 | d
 d
 }|dkr|||j   ||	  }|	dkr.||j  | }	|
dkrN|
||j  |
|  }
|dkrf||j |
 }d fdd	}j}j}d_||dkrdnd|	dkrdnd |
dkrdnd |dkrdnd  t_g }t|D ]}|g| }d|d  d| t_|dkr,||||dd}|	dkrF||||	dd}|
dkr`||||
dd}|dkrz||||dd}||7 }q|}t|}t|dk otj}tjr|s|g| }t|d d }tjr|D ]*}tj|jd|jjtj|jd qtjrH|sHtj|j d|jjtj!|jtj" dd
 |S )NFr	   Tr\   r   r]   r^   r_      rZ   c              	      s  |p|}|p|}|r|nd}	|r$|nd}
g }g }t |D ].}| | j|	 }| | j|
 }t|d d }t|d d }td||f}|| | |r|	nd|r|
ndf td||fd}t	|}|j
|r| nd|r| nd|r|j|  n||r|j|  n|fdd t|d tj}t|d tj}t|| }|tjt|d ddtjdd	 |rt| | j|	 n|j}|rt| | j|
 n|j}|r|n|j_|r|n|j_|rdn|| j| |rdn|| j| |r"|n|| j|r4|n|| jf}||}|_|| |}|| q8|_tdjjfd}t	|}|j
|r|d
  nd|r|d
  nd|r|j| d
  n||r|j| d
  n|fdd |_t}d d u r*|jd< |jd< t |D ]r}|| |j| |rPdn|| j|j| j |rndn|| j|j| j f || dd||f||< q2|S )Nr   rZ   RGBwhiteblack)fillg     o@r8   r7   r   r	   )r   r)   r*   mathceilr   newpaster   Draw	rectangler   asarrayastypefloat64rJ   append	fromarrayrD   uint8r&   crop
image_maskinit_imageslatent_maskr   seedrf   r   )initcountZexpand_pixelsis_leftis_rightis_top	is_bottomZis_horizZis_vertZpixels_horizZpixels_vertZimages_to_processoutput_imagesnZres_wZres_hZprocess_res_wZprocess_res_himgmaskdrawnp_imagenp_maskZnoisedtarget_widthtarget_heightcrop_regionZimage_to_processr|   procrF   Zinitial_seed_and_infomask_blur_xmask_blur_yrE   pprocess_heightprocess_widthr   r   expand   sx    $
*  



RzScript.run.<locals>.expandzBatch z out of )r   )r   )r   )r   r    )rf   r   grid)rf   short_filenamer   r   )FFFF)#r)   r*   inpaint_full_resinpainting_filldo_not_save_samplesdo_not_save_gridr   r   r{   rm   rn   n_iter
batch_sizer   	job_countr   jobr   
image_gridlenr   grid_only_if_multiplereturn_gridr   samples_save
save_imageoutpath_samplesr}   promptsamples_formatrf   	grid_saveoutpath_gridsgrid_formatgrid_extended_filename)rL   r   _rS   r[   r`   rE   rF   r\   r]   r^   r_   init_imgtarget_wtarget_hr   batch_countr   Zall_processed_imagesiimgs
all_imagesZcombined_grid_image"unwanted_grid_because_of_img_countresr   r   r   r   run   sx    






GN






(,z
Script.runN)__name__
__module____qualname__rM   rO   rg   r   r   r   r   r   rK   y   s   rK   )r	   r
   )rm   numpyr   rA   modules.scriptsscriptsgradiorb   PILr   r   modulesr   Zmodules.processingr   r   Zmodules.sharedr   r   rJ   rK   r   r   r   r   <module>   s   
i