151def maskVignettedRegion(exposure, polygon, maskPlane="NO_DATA", vignetteValue=None, log=None):
152 """Add mask bit to image pixels according to vignetted polygon region.
153
154 NOTE: this function could be used to mask and replace pixels associated
155 with any polygon in the exposure pixel coordinates.
156
157 Parameters
158 ----------
159 exposure : `lsst.afw.image.Exposure`
160 Image whose mask plane is to be updated.
161 polygon : `lsst.afw.geom.Polygon`
162 Polygon region defining the vignetted region in the pixel coordinates
163 of ``exposure``.
164 maskPlane : `str`, optional
165 Mask plane to assign vignetted pixels to.
166 vignetteValue : `float` or `None`, optional
167 Value to assign to the image array pixels within the ``polygon``
168 region. If `None`, image pixel values are not replaced.
169 log : `logging.Logger`, optional
170 Log object to write to.
171
172 Raises
173 ------
174 RuntimeError
175 Raised if no valid polygon exists.
176 """
177 log = log if log else logging.getLogger(__name__)
178 if not polygon:
179 log.info("No polygon provided. Masking nothing.")
180 return
181
182 fullyIlluminated = True
183 if not all(polygon.contains(exposure.getBBox().getCorners())):
184 fullyIlluminated = False
185 log.info("Exposure is fully illuminated? %s", fullyIlluminated)
186
187 if not fullyIlluminated:
188
189 mask = exposure.getMask()
190 xx, yy = np.meshgrid(np.arange(0, mask.getWidth(), dtype=float),
191 np.arange(0, mask.getHeight(), dtype=float))
192
193 vignMask = ~(polygon.contains(xx, yy))
194
195 bitMask = mask.getPlaneBitMask(maskPlane)
196 maskArray = mask.getArray()
197 maskArray[vignMask] |= bitMask
198 log.info("Exposure contains {} vignetted pixels which are now masked with mask plane {}.".
199 format(np.count_nonzero(vignMask), maskPlane))
200
201 if vignetteValue is not None:
202 imageArray = exposure.getImage().getArray()
203 imageArray[vignMask] = vignetteValue
204 log.info("Vignetted pixels in image array have been replaced with {}.".format(vignetteValue))