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)
Exemple #2
0
    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)
Exemple #3
0
 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 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)
Exemple #5
0
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