def setUp(self): np.random.seed(1) self.bbox = Box2I(Point2I(1000, 2000), Extent2I(200, 100)) self.filters = ["G", "R", "I"] self.imgValue = 10 images = [ImageF(self.bbox, self.imgValue) for f in self.filters] mImage = MultibandImage.fromImages(self.filters, images) self.Mask = Mask[MaskPixel] # Store the default mask planes for later use maskPlaneDict = self.Mask().getMaskPlaneDict() self.defaultMaskPlanes = sorted(maskPlaneDict, key=maskPlaneDict.__getitem__) # reset so tests will be deterministic self.Mask.clearMaskPlaneDict() for p in ("BAD", "SAT", "INTRP", "CR", "EDGE"): self.Mask.addMaskPlane(p) self.maskValue = self.Mask.getPlaneBitMask("BAD") singles = [self.Mask(self.bbox) for f in range(len(self.filters))] for n in range(len(singles)): singles[n].set(self.maskValue) mMask = MultibandMask.fromMasks(self.filters, singles) self.varValue = 1e-2 images = [ImageF(self.bbox, self.varValue) for f in self.filters] mVariance = MultibandImage.fromImages(self.filters, images) self.kernelSize = 51 self.psfs = [GaussianPsf(self.kernelSize, self.kernelSize, 4.0) for f in self.filters] self.psfImage = np.array([p.computeKernelImage().array for p in self.psfs]) self.exposure = MultibandExposure(image=mImage, mask=mMask, variance=mVariance, psfs=self.psfs, filters=self.filters)
def setUp(self): np.random.seed(1) self.bbox = Box2I(Point2I(1000, 2000), Extent2I(200, 100)) self.filters = ["G", "R", "I"] self.imgValue = 10 images = [ImageF(self.bbox, self.imgValue) for f in self.filters] mImage = MultibandImage.fromImages(self.filters, images) self.Mask = Mask[MaskPixel] # Store the default mask planes for later use maskPlaneDict = self.Mask().getMaskPlaneDict() self.defaultMaskPlanes = sorted(maskPlaneDict, key=maskPlaneDict.__getitem__) # reset so tests will be deterministic self.Mask.clearMaskPlaneDict() for p in ("BAD", "SAT", "INTRP", "CR", "EDGE"): self.Mask.addMaskPlane(p) self.maskValue = self.Mask.getPlaneBitMask("BAD") singles = [self.Mask(self.bbox) for f in range(len(self.filters))] for n in range(len(singles)): singles[n].set(self.maskValue) mMask = MultibandMask.fromMasks(self.filters, singles) self.varValue = 1e-2 images = [ImageF(self.bbox, self.varValue) for f in self.filters] mVariance = MultibandImage.fromImages(self.filters, images) self.maskedImage = MultibandMaskedImage(self.filters, image=mImage, mask=mMask, variance=mVariance)
def setUp(self): np.random.seed(1) self.bbox1 = Box2I(Point2I(1000, 2000), Extent2I(200, 100)) self.filters = ["G", "R", "I", "Z", "Y"] self.value1, self.value2 = 10, 100 images = [ImageF(self.bbox1, self.value1) for f in self.filters] self.mImage1 = MultibandImage.fromImages(self.filters, images) self.bbox2 = Box2I(Point2I(1100, 2025), Extent2I(30, 50)) images = [ImageF(self.bbox2, self.value2) for f in self.filters] self.mImage2 = MultibandImage.fromImages(self.filters, images)
def _testMaskedmageModification(testCase, maskedImage): images = [ ImageF(testCase.bbox, 10 * testCase.imgValue) for f in testCase.filters ] mImage = MultibandImage.fromImages(testCase.filters, images) maskedImage.image.array = mImage.array testCase.assertFloatsEqual(maskedImage.image["G"].array, mImage.array[0]) testCase.assertFloatsEqual(maskedImage["G"].image.array, mImage.array[0]) singles = [ testCase.Mask(testCase.bbox) for f in range(len(testCase.filters)) ] for n in range(len(singles)): singles[n].set(testCase.maskValue * 2) mMask = MultibandMask.fromMasks(testCase.filters, singles) maskedImage.mask.array = mMask.array testCase.assertFloatsEqual(maskedImage.mask["G"].array, mMask.array[0]) testCase.assertFloatsEqual(maskedImage["G"].mask.array, mMask.array[0]) images = [ ImageF(testCase.bbox, .1 * testCase.varValue) for f in testCase.filters ] mVariance = MultibandImage.fromImages(testCase.filters, images) maskedImage.variance.array = mVariance.array testCase.assertFloatsEqual(maskedImage.variance["G"].array, mVariance.array[0]) testCase.assertFloatsEqual(maskedImage["G"].variance.array, mVariance.array[0]) subBox = Box2I(Point2I(1100, 2025), Extent2I(30, 50)) maskedImage.image[:, subBox].array = 12 testCase.assertFloatsEqual(maskedImage.image["G", subBox].array, 12) testCase.assertFloatsEqual(maskedImage["G", subBox].image.array, 12) maskedImage["R", subBox].image[:] = 15 testCase.assertFloatsEqual(maskedImage.image["R", subBox].array, 15) testCase.assertFloatsEqual(maskedImage["R", subBox].image.array, 15) maskedImage.mask[:, subBox].array = 64 testCase.assertFloatsEqual(maskedImage.mask["G", subBox].array, 64) testCase.assertFloatsEqual(maskedImage["G", subBox].mask.array, 64) maskedImage["R", subBox].mask[:] = 128 testCase.assertFloatsEqual(maskedImage.mask["R", subBox].array, 128) testCase.assertFloatsEqual(maskedImage["R", subBox].mask.array, 128) maskedImage.variance[:, subBox].array = 1e-6 testCase.assertFloatsEqual(maskedImage.variance["G", subBox].array, 1e-6) testCase.assertFloatsEqual(maskedImage["G", subBox].variance.array, 1e-6) maskedImage["R", subBox].variance[:] = 1e-7 testCase.assertFloatsEqual(maskedImage.variance["R", subBox].array, 1e-7) testCase.assertFloatsEqual(maskedImage["R", subBox].variance.array, 1e-7)
def _testMaskedmageModification(testCase, maskedImage): images = [ImageF(testCase.bbox, 10*testCase.imgValue) for f in testCase.filters] mImage = MultibandImage.fromImages(testCase.filters, images) maskedImage.image.array = mImage.array testCase.assertFloatsEqual(maskedImage.image["G"].array, mImage.array[0]) testCase.assertFloatsEqual(maskedImage["G"].image.array, mImage.array[0]) singles = [testCase.Mask(testCase.bbox) for f in range(len(testCase.filters))] for n in range(len(singles)): singles[n].set(testCase.maskValue*2) mMask = MultibandMask.fromMasks(testCase.filters, singles) maskedImage.mask.array = mMask.array testCase.assertFloatsEqual(maskedImage.mask["G"].array, mMask.array[0]) testCase.assertFloatsEqual(maskedImage["G"].mask.array, mMask.array[0]) images = [ImageF(testCase.bbox, .1 * testCase.varValue) for f in testCase.filters] mVariance = MultibandImage.fromImages(testCase.filters, images) maskedImage.variance.array = mVariance.array testCase.assertFloatsEqual(maskedImage.variance["G"].array, mVariance.array[0]) testCase.assertFloatsEqual(maskedImage["G"].variance.array, mVariance.array[0]) subBox = Box2I(Point2I(1100, 2025), Extent2I(30, 50)) maskedImage.image[:, subBox].array = 12 testCase.assertFloatsEqual(maskedImage.image["G", subBox].array, 12) testCase.assertFloatsEqual(maskedImage["G", subBox].image.array, 12) maskedImage["R", subBox].image[:] = 15 testCase.assertFloatsEqual(maskedImage.image["R", subBox].array, 15) testCase.assertFloatsEqual(maskedImage["R", subBox].image.array, 15) maskedImage.mask[:, subBox].array = 64 testCase.assertFloatsEqual(maskedImage.mask["G", subBox].array, 64) testCase.assertFloatsEqual(maskedImage["G", subBox].mask.array, 64) maskedImage["R", subBox].mask[:] = 128 testCase.assertFloatsEqual(maskedImage.mask["R", subBox].array, 128) testCase.assertFloatsEqual(maskedImage["R", subBox].mask.array, 128) maskedImage.variance[:, subBox].array = 1e-6 testCase.assertFloatsEqual(maskedImage.variance["G", subBox].array, 1e-6) testCase.assertFloatsEqual(maskedImage["G", subBox].variance.array, 1e-6) maskedImage["R", subBox].variance[:] = 1e-7 testCase.assertFloatsEqual(maskedImage.variance["R", subBox].array, 1e-7) testCase.assertFloatsEqual(maskedImage["R", subBox].variance.array, 1e-7)
def modelToHeavy(source, mExposure, blend, xy0=Point2I(), dtype=np.float32): """Convert a scarlet model to a `MultibandFootprint`. Parameters ---------- source : `scarlet.Component` The source to convert to a `HeavyFootprint`. mExposure : `lsst.image.MultibandExposure` The multiband exposure containing the image, mask, and variance data. blend : `scarlet.Blend` The `Blend` object that contains information about the observation, PSF, etc, used to convolve the scarlet model to the observed seeing in each band. xy0 : `lsst.geom.Point2I` `(x,y)` coordinates of the lower-left pixel of the entire blend. dtype : `numpy.dtype` The data type for the returned `HeavyFootprint`. Returns ------- mHeavy : `lsst.detection.MultibandFootprint` The multi-band footprint containing the model for the source. """ # We want to convolve the model with the observed PSF, # which means we need to grow the model box by the PSF to # account for all of the flux after convolution. # FYI: The `scarlet.Box` class implements the `&` operator # to take the intersection of two boxes. # Get the PSF size and radii to grow the box py, px = blend.observations[0].psf.get_model().shape[1:] dh = py // 2 dw = px // 2 shape = (source.bbox.shape[0], source.bbox.shape[1] + py, source.bbox.shape[2] + px) origin = (source.bbox.origin[0], source.bbox.origin[1] - dh, source.bbox.origin[2] - dw) # Create the larger box to fit the model + PSf bbox = Box(shape, origin=origin) # Only use the portion of the convolved model that fits in the image overlap = bbox & source.frame.bbox # Load the full multiband model in the larger box model = source.model_to_box(overlap) # Convolve the model with the PSF in each band # Always use a real space convolution to limit artifacts model = blend.observations[0].renderer.convolve( model, convolution_type="real").astype(dtype) # Update xy0 with the origin of the sources box xy0 = Point2I(overlap.origin[-1] + xy0.x, overlap.origin[-2] + xy0.y) # Create the spans for the footprint valid = np.max(np.array(model), axis=0) != 0 valid = Mask(valid.astype(np.int32), xy0=xy0) spans = SpanSet.fromMask(valid) # Add the location of the source to the peak catalog peakCat = PeakCatalog(source.detectedPeak.table) peakCat.append(source.detectedPeak) # Create the MultibandHeavyFootprint foot = Footprint(spans) foot.setPeakCatalog(peakCat) model = MultibandImage(mExposure.filters, model, valid.getBBox()) mHeavy = MultibandFootprint.fromImages(mExposure.filters, model, footprint=foot) return mHeavy