@@ -371,9 +371,20 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0,
371
371
# this is to work around spurious warnings coming
372
372
# out of masked arrays.
373
373
with np .errstate (invalid = 'ignore' ):
374
- rgba [..., 1 ] = A < 0 # under data
375
- rgba [..., 2 ] = A > 1 # over data
376
- rgba [..., 3 ] = ~ A .mask # bad data
374
+ rgba [..., 1 ] = np .where (A < 0 , np .nan , 1 ) # under data
375
+ rgba [..., 2 ] = np .where (A > 1 , np .nan , 1 ) # over data
376
+ # Have to invert mask, Agg knows what alpha means
377
+ # so if you put this in as 0 for 'good' points, they
378
+ # all get zeroed out
379
+ rgba [..., 3 ] = 1
380
+ if A .mask .shape == A .shape :
381
+ # this is the case of a nontrivial mask
382
+ mask = np .where (A .mask , np .nan , 1 )
383
+ else :
384
+ # this is the case that the mask is a
385
+ # numpy.bool_ of False
386
+ mask = A .mask
387
+ # ~A.mask # masked data
377
388
A = rgba
378
389
output = np .zeros ((out_height , out_width , 4 ),
379
390
dtype = A .dtype )
@@ -414,12 +425,37 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0,
414
425
# Convert back to a masked greyscale array so
415
426
# colormapping works correctly
416
427
hid_output = output
428
+ # any pixel where the a masked pixel is included
429
+ # in the kernel (pulling this down from 1) needs to
430
+ # be masked in the output
431
+ if len (mask .shape ) == 2 :
432
+ out_mask = np .empty ((out_height , out_width ),
433
+ dtype = mask .dtype )
434
+ _image .resample (mask , out_mask , t ,
435
+ _interpd_ [self .get_interpolation ()],
436
+ True , 1 ,
437
+ self .get_filternorm () or 0.0 ,
438
+ self .get_filterrad () or 0.0 )
439
+ out_mask = np .isnan (out_mask )
440
+ else :
441
+ out_mask = mask
442
+ # we need to mask both pixels which came in as masked
443
+ # and the pixels that Agg is telling us to ignore (relavent
444
+ # to non-affine transforms)
445
+ # Use half alpha as the threshold for pixels to mask.
446
+ out_mask = out_mask | (hid_output [..., 3 ] < .5 )
417
447
output = np .ma .masked_array (
418
- hid_output [..., 0 ], hid_output [..., 3 ] < 0.5 )
419
- # relabel under data
420
- output [hid_output [..., 1 ] > .5 ] = - 1
448
+ hid_output [..., 0 ],
449
+ out_mask )
450
+ # 'unshare' the mask array to
451
+ # needed to suppress numpy warning
452
+ del out_mask
453
+ invalid_mask = ~ output .mask * ~ np .isnan (output .data )
454
+ # relabel under data. If any of the input data for
455
+ # the pixel has input out of the norm bounds,
456
+ output [np .isnan (hid_output [..., 1 ]) * invalid_mask ] = - 1
421
457
# relabel over data
422
- output [hid_output [..., 2 ] > .5 ] = 2
458
+ output [np . isnan ( hid_output [..., 2 ]) * invalid_mask ] = 2
423
459
424
460
output = self .to_rgba (output , bytes = True , norm = False )
425
461
0 commit comments