@@ -19,19 +19,13 @@ class RandomRotate(AbstractTransform):
1919
2020 :param `RandomRotate_angle_range_d`: (list/tuple or None)
2121 Rotation angle (degree) range along depth axis (x-y plane), e.g., (-90, 90).
22- The length of the list/tuple can be larger than 2, when `RandomRotate_discrete_mode` is True.
2322 If None, no rotation along this axis.
2423 :param `RandomRotate_angle_range_h`: (list/tuple or None)
2524 Rotation angle (degree) range along height axis (x-z plane), e.g., (-90, 90).
26- The length of the list/tuple can be larger than 2, when `RandomRotate_discrete_mode` is True.
2725 If None, no rotation along this axis. Only used for 3D images.
2826 :param `RandomRotate_angle_range_w`: (list/tuple or None)
2927 Rotation angle (degree) range along width axis (y-z plane), e.g., (-90, 90).
30- The length of the list/tuple can be larger than 2, when `RandomRotate_discrete_mode` is True.
3128 If None, no rotation along this axis. Only used for 3D images.
32- :param `RandomRotate_discrete_mode`: (optional, bool) Whether the rotate angles
33- are discrete values in rangle range. For example, if you only want to rotate
34- the images with a fixed set of angles like (90, 180, 270), then set discrete_mode mode as True.
3529 :param `RandomRotate_probability`: (optional, float)
3630 The probability of applying RandomRotate. Default is 0.5.
3731 :param `RandomRotate_inverse`: (optional, bool)
@@ -42,11 +36,8 @@ def __init__(self, params):
4236 self .angle_range_d = params ['RandomRotate_angle_range_d' .lower ()]
4337 self .angle_range_h = params .get ('RandomRotate_angle_range_h' .lower (), None )
4438 self .angle_range_w = params .get ('RandomRotate_angle_range_w' .lower (), None )
45- self .discrete_mode = params .get ('RandomRotate_discrete_mode' .lower (), False )
4639 self .prob = params .get ('RandomRotate_probability' .lower (), 0.5 )
4740 self .inverse = params .get ('RandomRotate_inverse' .lower (), True )
48- if (len (self .angle_range_d ) > 2 ):
49- assert (self .discrete_mode )
5041
5142 def __apply_transformation (self , image , transform_param_list , order = 1 ):
5243 """
@@ -61,38 +52,21 @@ def __apply_transformation(self, image, transform_param_list, order = 1):
6152 return image
6253
6354 def __call__ (self , sample ):
64- # if(random.random() > self.prob):
65- # sample['RandomRotate_triggered'] = False
66- # return sample
67- # else:
68- # sample['RandomRotate_triggered'] = True
6955 image = sample ['image' ]
7056 input_shape = image .shape
7157 input_dim = len (input_shape ) - 1
7258
7359 transform_param_list = []
7460 if (self .angle_range_d is not None ):
75- if (self .discrete_mode ):
76- idx = random .randint (0 , len (self .angle_range_d ) - 1 )
77- angle_d = self .angle_range_d [idx ]
78- else :
79- angle_d = np .random .uniform (self .angle_range_d [0 ], self .angle_range_d [1 ])
61+ angle_d = np .random .uniform (self .angle_range_d [0 ], self .angle_range_d [1 ])
8062 transform_param_list .append ([angle_d , (- 1 , - 2 )])
8163 if (input_dim == 3 ):
8264 if (self .angle_range_h is not None ):
83- if (self .discrete_mode ):
84- idx = random .randint (0 , len (self .angle_range_h ) - 1 )
85- angle_h = self .angle_range_h [idx ]
86- else :
87- angle_h = np .random .uniform (self .angle_range_h [0 ], self .angle_range_h [1 ])
88- transform_param_list .append ([angle_h , (- 1 , - 3 )])
65+ angle_h = np .random .uniform (self .angle_range_h [0 ], self .angle_range_h [1 ])
66+ transform_param_list .append ([angle_h , (- 1 , - 3 )])
8967 if (self .angle_range_w is not None ):
90- if (self .discrete_mode ):
91- idx = random .randint (0 , len (self .angle_range_w ) - 1 )
92- angle_w = self .angle_range_w [idx ]
93- else :
94- angle_w = np .random .uniform (self .angle_range_w [0 ], self .angle_range_w [1 ])
95- transform_param_list .append ([angle_w , (- 2 , - 3 )])
68+ angle_w = np .random .uniform (self .angle_range_w [0 ], self .angle_range_w [1 ])
69+ transform_param_list .append ([angle_w , (- 2 , - 3 )])
9670 assert (len (transform_param_list ) > 0 )
9771 # select a random transform from the possible list rather than
9872 # use a combination for higher efficiency
@@ -123,4 +97,49 @@ def inverse_transform_for_prediction(self, sample):
12397 transform_param_list [i ][0 ] = - transform_param_list [i ][0 ]
12498 sample ['predict' ] = self .__apply_transformation (sample ['predict' ] ,
12599 transform_param_list , 1 )
100+ return sample
101+
102+ class RandomRot90 (AbstractTransform ):
103+ """
104+ Random rotate an image in x-y plane with angles in [90, 180, 270].
105+
106+ The arguments should be written in the `params` dictionary, and it has the
107+ following fields:
108+
109+ :param `RandomRot90_probability`: (optional, float)
110+ The probability of applying RandomRot90. Default is 0.75.
111+ :param `RandomRot90_inverse`: (optional, bool)
112+ Is inverse transform needed for inference. Default is `True`.
113+ """
114+ def __init__ (self , params ):
115+ super (RandomRot90 , self ).__init__ (params )
116+ self .prob = params .get ('RandomRot90_probability' .lower (), 0.75 )
117+ self .inverse = params .get ('RandomRot90_inverse' .lower (), True )
118+
119+ def __call__ (self , sample ):
120+ if (random .random () > self .prob ):
121+ sample ['RandomRot90_triggered' ] = False
122+ sample ['RandomRot90_Param' ] = 0
123+ return sample
124+ else :
125+ sample ['RandomRot90_triggered' ] = True
126+ image = sample ['image' ]
127+ rote_k = random .randint (1 , 3 )
128+ sample ['RandomRot90_Param' ] = rote_k
129+ image_t = np .rot90 (image , rote_k , (- 2 , - 1 ))
130+ sample ['image' ] = image_t
131+ if ('label' in sample and \
132+ self .task in [TaskType .SEGMENTATION , TaskType .RECONSTRUCTION ]):
133+ sample ['label' ] = np .rot90 (sample ['label' ], rote_k , (- 2 , - 1 ))
134+ if ('pixel_weight' in sample and \
135+ self .task in [TaskType .SEGMENTATION , TaskType .RECONSTRUCTION ]):
136+ sample ['pixel_weight' ] = np .rot90 (sample ['pixel_weight' ], rote_k , (- 2 , - 1 ))
137+ return sample
138+
139+ def inverse_transform_for_prediction (self , sample ):
140+ if (not sample ['RandomRot90_triggered' ]):
141+ return sample
142+ rote_k = sample ['RandomRot90_Param' ]
143+ rote_i = 4 - rote_k
144+ sample ['predict' ] = np .rot90 (sample ['predict' ], rote_i , (- 2 , - 1 ))
126145 return sample
0 commit comments