o
    iy                  
   @  sX  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Z d dlmZ d dl	m
Z
 d dlZd dlZd dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< d d	l=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJ d d
lKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZi d dljmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z}m~Z~mZmZmZmZmZmZmZmZmZmZ d dlmZmZmZmZ d dlmZmZmZmZmZ d dlmZmZmZ d dlmZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ e
rd dlmZ dZned\ZZdd Zdd Zdd Zddd Zd!d" Zdd$d%Zdd&d'Zdd(d)Z	#dd+d,Zed-krejejgZeeăZeeed.d.d/eŃ eeeed.d0d1eŃ eeed.d2eŃ eeeed0d3eŃ eeed4d5eŃ eeeed4d6eŃ eeed7d8d9d:d;eŃ eeed<dd=d>eŃ eeeed<d?d@gd=dAeŃ eeed.d9d=dBeŃ eeeed.d9d?d@gd=dCeŃ eeedDdEd.d=dFeŃ eeed.dGd8d=dHed0 eeeed.dGd8d=d?d@gdIed0 eeeedDdEd.d=d?d@gdJeŃ ee&ed8dKeŃ ee'eed8dLeŃ eeed.dMeŃ eeeed.dNeŃ ee%edOdPeŃ ee(eedOd?d@gdQeŃ ee!ed.dRdRgdSeŃ ee"eed.dRdRgd?d@gdTeŃ ee,edUdVeŃ ee-eedWdXd@gdYeŃ ee#ed.dUdZd[eŃ ee$eed.dWd\dXd@gd]eŃ ee)ed d^d_edd` ee*eejd d^daedd` eeaed7dbdcedd` eeeejd7dbddedd` ee3ededfeŃ eeBeededgeŃ ee2ed#dheŃ eeAeeejd#dieŃ eeZed.d dOdjeŃ eeyeejd.d dOdkeŃ eeRedldmdneŃ eeqeejdldmdoeŃ ee_ed.dpdqeŃ ee~eejd.drdseŃ ee`ed7d.dtdjeŃ eeeejd7d.dtdkeŃ eededud.dveŃ eeeejdud.dweŃ eePedZdxeŃ eeoeejdZdyeŃ ee]ed7dzd{eŃ ee|eejd7dzd|eŃ eeged.d}edd` eeeejd.d~edd` eebed7ddedd` eeeejd7ddedd` eehed^dedd` eeeejd^dedd` eeced7dbdcedd` eeeejd7dbddedd` eeWed.ddeŃ eeveejd.ddeŃ eeUed d^dedd` eeteejd d^dedd` eeiedRd#ddedd` eeeejdRd#ddedd` eeeed d.d.d^dedd` eeeejd d.d.d^dedd` eefedudd.d^dedd` eeeejdudd.d^dedd` eeLed0dedd` eekeejd0dedd` eeVed.ddedd` eeueejd.ddedd` eeSeeej dd deŃ eereejejdd deŃ eeMeddeŃ eeleejddeŃ eeOed0deŃ eeneejd0deŃ eeTed*deŃ eeseed.deŃ ee\ed7d8deŃ ee{eejd7d8deŃ eeNeƃ enejd0eŃ eemeejdenejd0eŃ ee[ed.dMenejd0eŃ eezeejd.dNenejd0eŃ ee^ed.d*dedd` ee}eejd.d*dedd` eeXed.ddd deŃ eeweejd.ddd deŃ eeYed.dddeŃ eexeejd.dddeŃ eeQed^deŃ eepeejd^deŃ ee<eddeŃ ee+eeddeŃ ee/ed^deŃ ee>eed^deŃ ee;eddldeŃ eeJeeddldeŃ ee1edldeŃ ee@eedldeŃ ee7edld#deŃ eeFeedld#deŃ ee8eddld#deŃ eeGeeddld#deŃ ee9edldeej d kdeŃ eeHeedldejdeŃ ee5edleej d ddeŃ eeDeedlejd ddeŃ ee4edleej d kd0d d.gddeŃ eeCeedlejd0d d.gddeŃ ee:edldeŃ eeIeedldeŃ ee6edRdÍeŃ eeEeedRdčeŃ ee0edRdÍeŃ ee?eedRdčeŃ eeedd^dōedddƍ eeeejdd^dǍeddȍ eeeddʍeddȍ eeeejddˍeddȍ eeeƃ eddȍ eeeejdeddȍ eeedd͍eŃ eeeedd?d@gd΍eŃ eeed.dMeŃ eeeed.dNeŃ eeedldeŃ eeeedldXd@gdύeŃ eeŃZeej d kejɡeej< eeed.dʍedd0dЍ eeeejd.dˍedd0dЍ eeeddҍedd0dЍ eeeejddӍedd0dЍ eeed*dgd* d@d=dՍeŃ eeeed*dgd* d?d@gd=d֍eŃ eeed*d7dd؍eŃ eeeedd7dd?d@gdڍeŃ eeeddd7dݍeŃ eeeeddd7dލeŃ eeeddd7ddeŃ eeeeddd7ddeŃ eeeddd7dd?deŃ eeeeddd7dd?deŃ dS dS )    )annotationsN)deepcopy)glob)TYPE_CHECKING)download_and_extract)AffineAffined
AsDiscreteComposeEnsureChannelFirstdFlipFlipd
LoadImagedMapTransformOrientationOrientationdRand3DElasticRand3DElasticdRandFlip	RandFlipdRandomizable
RandRotateRandRotatedRandZoom	RandZoomdRotateRotate90	Rotate90dRotatedScaleIntensityScaleIntensitydSpatialPaddZoomZoomd)	BorderPadCenterScaleCropCenterSpatialCropCropForegroundDivisiblePadRandCropByLabelClassesRandCropByPosNegLabelRandScaleCropRandSpatialCropRandSpatialCropSamplesRandWeightedCropResizeWithPadOrCropSpatialCrop
SpatialPad)
BorderPaddCenterScaleCropdCenterSpatialCropdCropForegrounddDivisiblePaddRandCropByLabelClassesdRandCropByPosNegLabeldRandScaleCropdRandSpatialCropdRandSpatialCropSamplesdRandWeightedCropdResizeWithPadOrCropdSpatialCropd)AdjustContrastForegroundMaskGaussianSharpenGaussianSmooth
GibbsNoiseHistogramNormalizeKSpaceSpikeNoiseMaskIntensityMedianSmoothNormalizeIntensityRandAdjustContrastRandBiasFieldRandCoarseDropoutRandCoarseShuffleRandGaussianNoiseRandGaussianSharpenRandGaussianSmoothRandGibbsNoiseRandHistogramShiftRandKSpaceSpikeNoiseRandRicianNoiseRandScaleIntensityRandShiftIntensityRandStdShiftIntensitySavitzkyGolaySmoothScaleIntensityRangeScaleIntensityRangePercentilesShiftIntensityStdShiftIntensityThresholdIntensity)AdjustContrastdForegroundMaskdGaussianSharpendGaussianSmoothdGibbsNoisedHistogramNormalizedKSpaceSpikeNoisedMaskIntensitydMedianSmoothDNormalizeIntensitydRandAdjustContrastdRandBiasFielddRandCoarseDropoutdRandCoarseShuffledRandGaussianNoisedRandGaussianSharpendRandGaussianSmoothdRandGibbsNoisedRandHistogramShiftdRandKSpaceSpikeNoisedRandRicianNoisedRandScaleIntensitydRandShiftIntensitydRandStdShiftIntensitydSavitzkyGolaySmoothdScaleIntensityRangedScaleIntensityRangePercentilesdShiftIntensitydStdShiftIntensitydThresholdIntensityd)KeepLargestConnectedComponentLabelFilterLabelToContourRemoveSmallObjects)AsDiscretedKeepLargestConnectedComponentdLabelFilterdLabelToContourdRemoveSmallObjectsd)RandSmoothDeformRandSmoothFieldAdjustContrastRandSmoothFieldAdjustIntensity)RandSmoothDeformdRandSmoothFieldAdjustContrastdRandSmoothFieldAdjustIntensityd)GridDistortionRand2DElastic
RandAffineRandAxisFlipRandGridDistortionRandRotate90ResizeSpacing)GridDistortiondRand2DElasticdRandAffinedRandAxisFlipdRandGridDistortiondRandRotate90dResizedSpacingd)
CommonKeys)MONAIEnvVars)optional_importTzmatplotlib.pyplotc                 C  s   t  pt }d}d| d }tj|d}tj||}t||| tt	tj|d\}}t
t| t| ttjt| ddg}|tj|tj|i}	t|	| d  j}
t| |
|
|
f}||	S )	zGet the example data to be used.

    Use MarsAtlas as it only contains 1 image for quick download and
    that image is parcellated.
    zMarsAtlas-MNI-Colin27.zipz*https://www.dropbox.com/s/ndz8qtqblkciole/z?dl=1zMarsAtlas-MNI-Colin27z*.nii)r      spatial_axesr   )r   data_dirtempfilemkdtempospathjoinr   sortedr   r
   r   r   r    r   IMAGEr   LABELmaxshaper!   )keys	cache_dirfnameurlout_pathzip_pathimagelabel
transformsdatamax_sizepadder r   m/home/dell461/cl/sdc2/last_ska_mid/HISourceFinder-master-l/src/monai/transforms/utils_create_transform_ims.pyget_data   s$   
r   c           	      C  s  t | }| }W d   n1 sw   Y  d}t|D ]\}}d| d |v r.|} nq|du r7td|d }d|| v rCdS t|}||d| d  ||d d	| d
  t|t|d kritt | d}|| W d   dS 1 sw   Y  dS )z
    Find the documentation for a given transform and if it's missing,
    add a pointer to the transform's example image.
    N`z%Couldn't find transform documentationr   z.. imagezJ.. image:: https://github.com/Project-MONAI/DocImages/raw/main/transforms/z.png
   z    :alt: example of 
w)	open	readlines	enumerateRuntimeErrorr   insertlenAssertionError
writelines)	Z	code_pathtransform_namefcontentsZ	doc_startilineZ
image_lineZcontents_origr   r   r   update_docstring   s2   


"r   c                 C  s:   |dkrdd |   D } |r| S |r| tj S | tj S )z`If transform requires 2D data, then convert to 2D by selecting the middle of the last dimension.r   c                 S  s(   i | ]\}}||d |j d d f qS ).r   )r   ).0kvr   r   r   
<dictcomp>  s   ( z$pre_process_data.<locals>.<dictcomp>)itemsr   r   r   )r   ndimis_mapis_postr   r   r   pre_process_data  s
   r   viewintc                 C  sl   | j dkr| }n#| j}dd |D }|| d }t||d ||< t| t| |}|r4tj||dk< |S )zsIf image is 3d, get the central slice. If is already 2d, return as-is.
    If image is label, set 0 to np.nan.
    r   c                 S  s   g | ]}t d |qS r   )slice)r   sr   r   r   
<listcomp>       z get_2d_slice.<locals>.<listcomp>r   r   )r   r   r   npsqueezetuplenan)r   r   is_labeloutr   slices_slicer   r   r   get_2d_slice  s   
r   c                   s    fddt dD S )zGet the 3 orthogonal views and stack them into 1 image.
    Requires that all images be same size, but this is taken care
    of by the `SpatialPadd` earlier.
    c                   s   g | ]}t  |qS r   r   r   r   imr   r   r   r   .  s    z&get_stacked_2d_ims.<locals>.<listcomp>   )ranger   r   r   r   get_stacked_2d_ims)  s   r   Fc                   s    fdd| |fD S )zrStack before and after images into 1 image if 3d.
    Requires that before and after images be the same size.
    c                   s   g | ]}t | qS r   )r   r   dr   r   r   r   5  r   z,get_stacked_before_after.<locals>.<listcomp>r   )beforeafterr   r   r   r   get_stacked_before_after1  s   r   c                 C  s  t jddi t jd t| }t| d }dd | D }	t jdd}
|
j||dd|	d	}t|D ]}t	d
d | | D }t
dd | | D }t|D ]}|
|||f }|j| | | d||d}|d |r{||d kr{t j||d |dkr|rdnd}||d |d krd||  nd7 }|| ||d ks|r|g  n|j  t|j D ]\}}|dkr|d q|g  |d |dur|j|| | dddd qOq3|d }| D ]<\}}||d 7 }t|tr|d| d 7 }nt|tjtjfr|d 7 }nt|r|d!7 }n|t|7 }|d"7 }qt|dkr3|dd# }|d$7 }t j!|d%dd&t|d  d'}|
j"|d(d)d* |
#| t $|
 dS )+zCSave image to file, ensuring there's no whitespace around the edge.zfont.family	monospaceZdark_backgroundr   c                 S  s   g | ]}t |d  jd  qS r   )floatr   )r   rr   r   r   r   ?  s    zsave_image.<locals>.<listcomp>T)tight_layout)hspacewspaceheight_ratiosc                 s      | ]}|  V  qd S N)minr   r   r   r   	<genexpr>C      zsave_image.<locals>.<genexpr>c                 s  r   r   )r   r   r   r   r   r   D  r   gray)cmapvminvmaxequalr   )axZAfterZBeforer    r   FNhsv?nearest)r   alphainterpolation(='z[array]z
[callable]z, )2    )break_long_wordssubsequent_indent皙?left)xhorizontalalignment)%pltrcParamsupdatestyleuser   figureadd_gridspecr   r   r   add_subplotimshow
set_aspectcolorbar
set_ylabel
set_yticksyaxis
tick_rightr   get_ticklabelsset_visible
set_xticksset_frame_onr   
isinstancestrr   ndarraytorchTensorcallabletextwrapfillsuptitlesavefigclose)imageslabelsfilenamer   transform_argsshapesr"  nrowncolhsfigspecrowr  r  colr  r   Zy_labelnr   titler   r   r   r   r   
save_image8  sf   
$









rD  c                   sp  t  ts g rtjntjt  d tfdd D  dd  D  t } d jdkr5dnd}|dkr@| dndt d j	 }t
|D ] fd	dt
|D  < qMg }|dkrm d }||fS tt|d
 }t
|D ]9tfdd D }|j	\}}	}
|| }||| krt||||	|
dd|	| |
| }|| qz||fS )zGet image. If is dictionary, extract key. If is list, stack. If both dictionary and list, do both.
    Also return the image size as string to be used im the imshow. If it's a list, return `N x (H,W,D)`.
    r   c                   s   g | ]
} r
| n|qS r   r   r   )r   keyr   r   r   }      zget_images.<locals>.<listcomp>c                 S  s   g | ]}|d  qS r   r   r   r   r   r   r   ~      r   r   z x r  c                   s   g | ]
}t   |qS r   r   )r   r   )r   r   r   r   r   r     rF        ?c                   s   g | ]}|  qS r   r   r   )r   r   r   r     rG  r   )r+  listr   r   r   dictr   r   r,  r   r   r   r   floorasarrayNotImplementedErrorreshapeswapaxesappend)r   r   num_samplesZnum_orthog_views	shape_strr   nrowsresultZnindexheightwidthncolsr   )r   r   r   r   rE  r   r   
get_imagesr  s2   
$ (rX  r   c                 C  sP  | di |} t stt| tr t| tr|d n|}| | t }|du r,tdtj	
|d}| jj}	|	d }
tj	
||
}t| t}tt||||}| t|}t|\}}t|\}}||f}||f}d}|rt|dd^}}t|dd^}}||f}t||||	||| |rttjjj}tj	
|dd	d
}t||	 dS dS )zCreate an image with the before and after of the transform.
    Also update the transform's documentation to point to this image.r   NztPlease git clone https://github.com/Project-MONAI/DocImages and then set the environment variable `MONAI_DOC_IMAGES`r   z.pngTr   docssourceztransforms.rstr   )has_matplotlibr   r+  r   r   set_random_stater   
doc_imagesr   r   r   	__class____name__r   r   rX  rD  pathlibPath__file__parentr   )	transformr9  r   r   r"  Z
update_docseedr   Zout_dirr   Z	out_fnameout_filer   data_inZdata_trZimages_beforebefore_shapeZimages_afterafter_shaper6  r:  r7  Zlabels_before_Zlabels_afterbase_dirZrst_pathr   r   r   create_transform_im  sB   


rl  __main__r   )probspatial_axisr   )r   rn  ro  )ro  )r   ro  ZRPI)axcodes)r   rp  g      ?)r   r   )rH  rH  )r   r   r   )rn  sigma_rangemagnitude_rangeshear_range)r   rH  r   zeros)shear_params
image_onlypadding_modebilinearr  )r   ru  moderw  )rn  rs  rw  )r   rn  rs  ry  rw  )      )r     )rq  rr  rn  rw  )   r}  )rn  spacingrr  rw  )r   rn  r~  rr  rw  ry  )r   rq  rr  rn  rw  ry  r   )r   r   )rn  )r   rn  r  )angle)r   r  ry  g?)rn  range_x)r   rn  r  ry  333333?)zoomg?area)r   r  ry  皙?)rn  min_zoommax_zoom      ?)r   rn  r  r  ry  
   )minvmaxv)r"  )r   r  r  )rz  r  )rn  factors)r   rn  r  @   )r   )r   r   )allow_smaller)r   
source_keyr  )rn  meanstd)r   rn  r  r  )d   r  r     )lock_intensity)r   r  r  )r  r  )rn  intensity_range)r     )r   rn  r  rH  rz  )window_lengthorder)r   r  r  )r	  )r   r	  )r  r  )rn  r	  )r   rn  r	  )offset)r   r  )r  r}  )rn  offsets)r   rn  r  )factor)r   r  )皙?333333?)rn  coeff_range)r   rn  r  )
subtrahenddivisor)r   r  r  r  )	thresholdabovecval)r   r  r  r  )a_mina_maxb_minb_max)r   r  r  r  r  _   )lowerupperr  r  )r   r  r  r  r  )gamma)r   r  )r  r   )rn  r  )r   rn  r  c                 C     | dkS Nr  r   r  r   r   r   <lambda>N      r  )	mask_data	select_fnc                 C  r  r  r   r  r   r   r   r  P  r  )r   mask_keyr  )invert)r   r  )sigma)r   r  )radius)r   r  )rn  sigma_x)r   rn  r  )r   )rn  num_control_points)r   rn  r     r}  )rn  holesspatial_size
fill_value)r   rn  r  r  r  )rn  r  r  )r   rn  r  r  )num_bins)r   r  ),  r  r  )r  )r   r  )spatial_border)r   r  )K   r  r  )
roi_centerroi_size)r   r  r  )r  )r   r  )r  random_size)r   r  r     )rQ  r  r  )r   rQ  r  r  )r  rQ  
weight_map)r   r  rQ  w_key)r  r   negrQ  )r   r  	label_keyr  rQ  )r  r   num_classesratiosrQ  )r   r  r  r  r  rQ  )	roi_scale)r   r  )	to_onehotr  )r   r"  )r   r  r  )r   )r   r   r   r  rz     )applied_labels)r   r  )rz  rz  rz  )pixdim)r   r  ry  )r   r  ry  )r   r   r  )min_size)r   r  )r  r  r  r  )	num_cellsdistort_stepsry  rw  )r   r  r  ry  rw  )gr  )r  rn  distort_limit)gɿr  )r   r  rn  r  ry  )   r  r  )r  r  r  )r  	rand_sizern  )r   r  r  rn  )rH  g      @)r  r  rn  r  )r   r  r  rn  r  g?)r  r  rn  	def_range	grid_mode)r   r  r  rn  r  r  )r   r   )F)r   FTr   F)
__future__r   r   r`  r   r1  copyr   r   typingr   numpyr   r.  
monai.appsr   monai.transformsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   monai.transforms.croppad.arrayr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   Z#monai.transforms.croppad.dictionaryr2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>    monai.transforms.intensity.arrayr?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   Z%monai.transforms.intensity.dictionaryr]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   monai.transforms.post.arrayr{   r|   r}   r~   Z monai.transforms.post.dictionaryr   r   r   r   r   Z#monai.transforms.smooth_field.arrayr   r   r   Z(monai.transforms.smooth_field.dictionaryr   r   r   monai.transforms.spatial.arrayr   r   r   r   r   r   r   r   Z#monai.transforms.spatial.dictionaryr   r   r   r   r   r   r   r   monai.utils.enumsr   monai.utils.miscr   monai.utils.moduler   matplotlib.pyplotpyplotr  r[  r   r   r   r   r   r   rD  rX  rl  r_  r   r   r   r   rJ  Zdata_binaryastypefloat32r   r   r   r   <module>   s  |@<  ((

&
	


:,

5    