@@ -3258,7 +3258,10 @@ def normalize_mean_std(
32583258 ) -> Self :
32593259 """Normalize the intensities using the mean and variance.
32603260
3261- The resulting volume has zero mean and unit variance.
3261+ The resulting volume has zero mean and unit variance. If the input
3262+ array (or a given channel if ``per_channel``) contains only a single
3263+ unique value, the returned array will be shifted to the output mean and
3264+ will not be scaled (since this would result in a division by zero).
32623265
32633266 Parameters
32643267 ----------
@@ -3279,17 +3282,31 @@ def normalize_mean_std(
32793282 be promoted to floating point.
32803283
32813284 """
3285+ if output_std <= 0.0 :
3286+ raise ValueError (
3287+ "The 'output_std' must be greater than or equal to zero."
3288+ )
3289+
32823290 if (
32833291 per_channel and
32843292 self .number_of_channel_dimensions > 0
32853293 ):
32863294 mean = self .array .mean (axis = (0 , 1 , 2 ), keepdims = True )
32873295 std = self .array .std (axis = (0 , 1 , 2 ), keepdims = True )
3296+
3297+ scale = std / output_std
3298+
3299+ # Avoid division by zero
3300+ scale [scale == 0.0 ] = 1.0
32883301 else :
32893302 mean = self .array .mean ()
32903303 std = self .array .std ()
3304+
3305+ # Avoid division by zero
3306+ scale = 1.0 if std == 0.0 else (std / output_std )
3307+
32913308 new_array = (
3292- (self .array - mean ) / ( std / output_std ) + output_mean
3309+ (self .array - mean ) / scale + output_mean
32933310 )
32943311
32953312 return self .with_array (new_array )
@@ -3332,11 +3349,22 @@ def normalize_min_max(
33323349 ):
33333350 imin = self .array .min (axis = (0 , 1 , 2 ), keepdims = True )
33343351 imax = self .array .max (axis = (0 , 1 , 2 ), keepdims = True )
3352+
3353+ peak_to_peak = imax - imin
3354+
3355+ # Avoid division by zerp
3356+ peak_to_peak [peak_to_peak == 0.0 ] = output_range
3357+ scale_factor = output_range / peak_to_peak
33353358 else :
33363359 imin = self .array .min ()
33373360 imax = self .array .max ()
33383361
3339- scale_factor = output_range / (imax - imin )
3362+ if imin == imax :
3363+ # Avoid division by zero
3364+ scale_factor = 1.0
3365+ else :
3366+ scale_factor = output_range / (imax - imin )
3367+
33403368 new_array = (self .array - imin ) * scale_factor + output_min
33413369
33423370 return self .with_array (new_array )
0 commit comments