U Phy @sVddlmZddlZddlZddlZddlZddlmZddlmZddl m Z ddl Z ddl Z ddlmZddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm 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-ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;mZ>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJdd lKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZidd ljmkZkmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z}m~Z~mZmZmZmZmZmZmZmZmZmZdd lmZmZmZmZdd lmZmZmZmZmZddlmZmZmZddlmZmZmZddlmZmZmZmZmZmZmZmZddlmZmZmZmZmZmZmZmZddlmZddlmZddlmZe rLddlmZdZn ed\ZZddZddZddZdddd Zd!d"Zdd$d%Zdd&d'Zdd(d)Zdd+d,Zed-krRejejgZeeăZeeed.d.d/eŃeeeed.d0d1eŃeeed.d2eŃeeeed0d3eŃeeed4d5eŃeeeed4d6eŃeeed7d8d9d:d;eŃeeedeŃeeeedeed^deŃee;eddldeŃeeJeeddldeŃee1edldeŃee@eedldeŃee7edld#deŃeeFeedld#deŃee8eddld#deŃeeGeeddld#deŃee9edldeejdkdeŃeeHeedldejdeŃee5edleejdddeŃeeDeedlejdddeŃee4edleejdkd0dd.gddeŃeeCeedlejd0dd.gddeŃee:edldeŃeeIeedldeŃee6edRdÍeŃeeEeedRdčeŃee0edRdÍeŃee?eedRdčeŃeeedd^dōedddƍeeeejdd^dǍeddȍeeeddʍeddȍeeeejddˍeddȍeeeƃeddȍeeeejdeddȍeeedd͍eŃeeeedd?d@gd΍eŃeeed.dMeŃeeeed.dNeŃeeedldeŃeeeedldXd@gdύeŃeeŃZeejdke jɡeej<eeed.dʍedd0dЍeeeejd.dˍedd0dЍeeeddҍedd0dЍeeeejddӍedd0dЍeeed*dgd*d@d=dՍeŃeeeed*dgd*d?d@gd=d֍eŃeeed*d7dd؍eŃeeeedd7dd?d@gdڍeŃeeeddd7dݍeŃeeeeddd7dލeŃeeeddd7ddeŃeeeeddd7ddeŃeeeddd7dd?deŃeeeeddd7dd?deŃdS)) annotationsN)deepcopy)glob) TYPE_CHECKING)download_and_extract)AffineAffined AsDiscreteComposeEnsureChannelFirstdFlipFlipd LoadImaged MapTransform Orientation Orientationd Rand3DElasticRand3DElasticdRandFlip RandFlipd Randomizable RandRotate RandRotatedRandZoom RandZoomdRotateRotate90 Rotate90dRotatedScaleIntensityScaleIntensityd SpatialPaddZoomZoomd) BorderPadCenterScaleCropCenterSpatialCropCropForeground DivisiblePadRandCropByLabelClassesRandCropByPosNegLabel RandScaleCropRandSpatialCropRandSpatialCropSamplesRandWeightedCropResizeWithPadOrCrop SpatialCrop SpatialPad) BorderPaddCenterScaleCropdCenterSpatialCropdCropForegroundd DivisiblePaddRandCropByLabelClassesdRandCropByPosNegLabeldRandScaleCropdRandSpatialCropdRandSpatialCropSamplesdRandWeightedCropdResizeWithPadOrCropd SpatialCropd)AdjustContrastForegroundMaskGaussianSharpenGaussianSmooth GibbsNoiseHistogramNormalizeKSpaceSpikeNoise MaskIntensity MedianSmoothNormalizeIntensityRandAdjustContrast RandBiasFieldRandCoarseDropoutRandCoarseShuffleRandGaussianNoiseRandGaussianSharpenRandGaussianSmoothRandGibbsNoiseRandHistogramShiftRandKSpaceSpikeNoiseRandRicianNoiseRandScaleIntensityRandShiftIntensityRandStdShiftIntensitySavitzkyGolaySmoothScaleIntensityRangeScaleIntensityRangePercentilesShiftIntensityStdShiftIntensityThresholdIntensity)AdjustContrastdForegroundMaskdGaussianSharpendGaussianSmoothd GibbsNoisedHistogramNormalizedKSpaceSpikeNoisedMaskIntensityd MedianSmoothDNormalizeIntensitydRandAdjustContrastdRandBiasFielddRandCoarseDropoutdRandCoarseShuffledRandGaussianNoisedRandGaussianSharpendRandGaussianSmoothdRandGibbsNoisedRandHistogramShiftdRandKSpaceSpikeNoisedRandRicianNoisedRandScaleIntensitydRandShiftIntensitydRandStdShiftIntensitydSavitzkyGolaySmoothdScaleIntensityRangedScaleIntensityRangePercentilesdShiftIntensitydStdShiftIntensitydThresholdIntensityd)KeepLargestConnectedComponent LabelFilterLabelToContourRemoveSmallObjects) AsDiscretedKeepLargestConnectedComponentd LabelFilterdLabelToContourdRemoveSmallObjectsd)RandSmoothDeformRandSmoothFieldAdjustContrastRandSmoothFieldAdjustIntensity)RandSmoothDeformdRandSmoothFieldAdjustContrastdRandSmoothFieldAdjustIntensityd)GridDistortion Rand2DElastic RandAffine RandAxisFlipRandGridDistortion RandRotate90ResizeSpacing)GridDistortiondRand2DElasticd RandAffined RandAxisFlipdRandGridDistortiond RandRotate90dResizedSpacingd) CommonKeys) MONAIEnvVars)optional_importTzmatplotlib.pyplotc Cstpt}d}d|d}tj|d}tj||}t|||tt tj|d\}}t t |t |t tjt|ddg}|tj|tj|i} t| |dj} 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. zMarsAtlas-MNI-Colin27.zipz*https://www.dropbox.com/s/ndz8qtqblkciole/z?dl=1zMarsAtlas-MNI-Colin27z*.nii)r spatial_axesr)rdata_dirtempfilemkdtempospathjoinrsortedrr rr r rIMAGErLABELmaxshaper!) keys cache_dirfnameurlout_pathzip_pathimagelabel transformsdatamax_sizepadderr`/home/dell461/cl/sdc2/HISourceFinder-master-l/src/monai/transforms/utils_create_transform_ims.pyget_datas$   rc Cst|}|}W5QRXd}t|D] \}}d|d|kr(|}qJq(|dkrZtd|d}d||krrdSt|}||d|d||dd |d t|t|dkrtt|d }||W5QRXdS) 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 documentationrz.. imagezJ.. image:: https://github.com/Project-MONAI/DocImages/raw/main/transforms/z.png z :alt: example of  w) open readlines enumerate RuntimeErrorrinsertlenAssertionError writelines) Z code_pathtransform_namefcontentsZ doc_startilineZ image_lineZ contents_origrrrupdate_docstrings,    rcCsT|dkr4tD]&}||d||jddf||<q |r<|S|rJ|tjS|tjS)z1If transform requires 2D data, then convert to 2Dr.)rrrrr)rndimis_mapis_postkrrrpre_process_datas $rintviewcCsl|jdkr|}nF|j}dd|D}||d}t||d||<t|t||}|rhtj||dk<|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. rcSsg|]}td|qSr)slice).0srrr "sz get_2d_slice..rr)rrrnpsqueezetuplenan)rris_labeloutrslices_slicerrr get_2d_slices  rcsfddtdDS)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. csg|]}t|qSrrrrimrrrr0sz&get_stacked_2d_ims..)rangerrrrget_stacked_2d_ims+srFcsfdd||fDS)zrStack before and after images into 1 image if 3d. Requires that before and after images be the same size. csg|]}t|qSr)rrdrrrr7sz,get_stacked_before_after..r)beforeafterrrrrget_stacked_before_after3srcCstjdditjdt|}t|d}dd|D} tjdd} | j||dd| d } t|D]j} t d d || D} t d d || D}t|D].}| | | |f}|j || |d | |d}| d|r||dkrtj||d|dkrB| rdnd}||d|dkr2d|| nd7}||||dksV|rb|gn8|jt|jD]\}}|dkrz|dqz|g|d|dk r|j || |ddddqqf|d}|D]z\}}||d7}t|tr|d|d7}n>t|tjtjfr4|d 7}n t|rH|d!7}n |t|7}|d"7}qt|dkrz|dd#}|d$7}t j!|d%dd&t|dd'}| j"|d(d)d*| #|t$| dS)+zCSave image to file, ensuring there's no whitespace around the edge.z font.family monospaceZdark_backgroundrcSsg|]}t|djdqSr)floatr)rrrrrrAszsave_image..T) tight_layout)hspacewspace height_ratioscss|]}|VqdSN)minrrrr Eszsave_image..css|]}|VqdSr)rrrrrrFsgray)cmapvminvmaxequalr)axZAfterZBeforerrFNhsv?nearest)ralpha interpolation(='z[array]z [callable]z, )2 )break_long_wordssubsequent_indent皙?left)xhorizontalalignment)%pltrcParamsupdatestyleuserfigure add_gridspecrrr add_subplotimshow set_aspectcolorbar set_ylabel set_yticksyaxis tick_rightrget_ticklabels set_visible set_xticks set_frame_onitems isinstancestrrndarraytorchTensorcallabletextwrapfillsuptitlesavefigclose)imageslabelsfilenamertransform_argsshapesrnrowncolhsfigspecrowrrcolrrZy_labelnrtitlervrrr save_image:s`     &               rAc slttsgrtjntjtdtfddDddDt}djdkrjdnd}|dkr|dndtdj }t |D]"fd dt |D<qg}|dkrԈd}nt t |d }t |D]tt fd dD}|j \}} } ||} ||| kr0t||| | | dd | || | }||q||fS) 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)`. rcsg|]}r|n|qSrrr)rkeyrrrszget_images..cSsg|] }|dqSrrrrrrrsrrz x rcsg|]}t|qSrr)rr)rrrrrrs?csg|] }|qSrrrrrrrsr)r'listrrrdictrrr(rrrrfloorasarrayNotImplementedErrorreshapeswapaxesappend) rr num_samplesZnum_orthog_views shape_strrnrowsresultZnindexheightwidthncolsr)rrrrrBrr get_imagests0 $     ( rSrcCsL|f|}tstt|trPr) mask_data select_fncCs|dkSrrrrrrrRr)rmask_keyr)invert)rr)sigma)rr)radius)rr)risigma_x)rrir)r)rinum_control_points)rrirrx)riholes spatial_size fill_value)rrirrr)rirr)rrirr)num_bins)rr),rr)r)rr)spatial_border)rr)Krr) roi_centerroi_size)rrr)r)rr)r random_size)rrr)rLrr)rrLrr)rrL weight_map)rrrLw_key)rrnegrL)rr label_keyrrL)rr num_classesratiosrL)rrrrrrL) roi_scale)rr) to_onehotr)rr)rrr)r)rrrrru)applied_labels)rr)rururu)pixdim)rrrt)rrrt)rrr)min_size)rr)rrrr) num_cells distort_stepsrtrr)rrrrtrr)gr)rri distort_limit)gɿr)rrrirrt)rr)rrr)r rand_sizeri)rrrri)rCg@)rrrir)rrrrirg?)rrri def_range grid_mode)rrrrirr)F)F)F)rFTrF) __future__rrr[rr-copyrrtypingrnumpyrr* monai.appsrmonai.transformsrrr r r r r rrrrrrrrrrrrrrrrrrr r!r"r#Zmonai.transforms.croppad.arrayr$r%r&r'r(r)r*r+r,r-r.r/r0r1Z#monai.transforms.croppad.dictionaryr2r3r4r5r6r7r8r9r:r;r<r=r>Z monai.transforms.intensity.arrayr?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\Z%monai.transforms.intensity.dictionaryr]r^r_r`rarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzmonai.transforms.post.arrayr{r|r}r~Z monai.transforms.post.dictionaryrrrrrZ#monai.transforms.smooth_field.arrayrrrZ(monai.transforms.smooth_field.dictionaryrrrmonai.transforms.spatial.arrayrrrrrrrrZ#monai.transforms.spatial.dictionaryrrrrrrrrmonai.utils.enumsrmonai.utils.miscrmonai.utils.modulermatplotlib.pyplotpyplotrrVrrrrrrrArSrgrZrrrrrEZ data_binaryastypefloat32rrrr s     |@< ( (     &   : , 5