44
55if TYPE_CHECKING :
66 from autoarray .structures .arrays .uniform_2d import Array2D
7+ from autoarray .structures .arrays .rgb import Array2DRGB
78
89from autoarray .structures .arrays import array_2d_util
910from autoarray .structures .grids import grid_2d_util
@@ -229,7 +230,7 @@ def mask_2d_from(self, buffer: int = 1) -> "Mask2D":
229230 origin = self .mask .origin ,
230231 )
231232
232- def array_2d_from (self , array : Array2D , buffer : int = 1 ) -> Array2D :
233+ def array_2d_from (self , array : Array2D , buffer : int = 1 ) -> Array2D :
233234 """
234235 Extract the 2D region of an array corresponding to the rectangle encompassing all unmasked values.
235236
@@ -241,24 +242,82 @@ def array_2d_from(self, array : Array2D, buffer: int = 1) -> Array2D:
241242 The number pixels around the extracted array used as a buffer.
242243 """
243244 from autoarray .structures .arrays .uniform_2d import Array2D
245+ from autoarray .structures .arrays .rgb import Array2DRGB
244246 from autoarray .mask .mask_2d import Mask2D
245247
248+ if isinstance (array , Array2DRGB ):
249+ return self .array_2d_rgb_from (array = array , buffer = buffer )
250+
246251 extracted_array_2d = array_2d_util .extracted_array_2d_from (
247- array_2d = np . array ( array .native ) ,
252+ array_2d = array .native . array ,
248253 y0 = self .region [0 ] - buffer ,
249254 y1 = self .region [1 ] + buffer ,
250255 x0 = self .region [2 ] - buffer ,
251256 x1 = self .region [3 ] + buffer ,
252257 )
253258
254- mask = Mask2D .all_false (
255- shape_native = extracted_array_2d .shape ,
259+ extracted_mask_2d = array_2d_util .extracted_array_2d_from (
260+ array_2d = np .array (self .mask ),
261+ y0 = self .region [0 ] - buffer ,
262+ y1 = self .region [1 ] + buffer ,
263+ x0 = self .region [2 ] - buffer ,
264+ x1 = self .region [3 ] + buffer ,
265+ )
266+
267+ mask = Mask2D (
268+ mask = extracted_mask_2d ,
256269 pixel_scales = array .pixel_scales ,
257270 origin = array .mask .mask_centre ,
258271 )
259272
260- arr = array_2d_util .convert_array_2d (
261- array_2d = extracted_array_2d , mask_2d = mask
273+ arr = array_2d_util .convert_array_2d (array_2d = extracted_array_2d , mask_2d = mask )
274+
275+ return Array2D (values = arr , mask = mask , header = array .header )
276+
277+ def array_2d_rgb_from (self , array : Array2DRGB , buffer : int = 1 ) -> Array2DRGB :
278+ """
279+ Extract the 2D region of an RGB array corresponding to the rectangle encompassing all unmasked values.
280+
281+ This works the same as the `array_2d_from` method, but for RGB arrays, meaning that it iterates over the three
282+ channels of the RGB array and extracts the region for each channel separately.
283+
284+ This is used to extract and visualize only the region of an RGB image that is used in an analysis.
285+
286+ Parameters
287+ ----------
288+ buffer
289+ The number pixels around the extracted array used as a buffer.
290+ """
291+ from autoarray .structures .arrays .rgb import Array2DRGB
292+ from autoarray .mask .mask_2d import Mask2D
293+
294+ for i in range (3 ):
295+
296+ extracted_array_2d = array_2d_util .extracted_array_2d_from (
297+ array_2d = np .array (array .native [:, :, i ]),
298+ y0 = self .region [0 ] - buffer ,
299+ y1 = self .region [1 ] + buffer ,
300+ x0 = self .region [2 ] - buffer ,
301+ x1 = self .region [3 ] + buffer ,
302+ )
303+
304+ if i == 0 :
305+ array_2d_rgb = np .zeros ((extracted_array_2d .shape [0 ], extracted_array_2d .shape [1 ], 3 ))
306+
307+ array_2d_rgb [:, :, i ] = extracted_array_2d
308+
309+ extracted_mask_2d = array_2d_util .extracted_array_2d_from (
310+ array_2d = np .array (self .mask ),
311+ y0 = self .region [0 ] - buffer ,
312+ y1 = self .region [1 ] + buffer ,
313+ x0 = self .region [2 ] - buffer ,
314+ x1 = self .region [3 ] + buffer ,
315+ )
316+
317+ mask = Mask2D (
318+ mask = extracted_mask_2d ,
319+ pixel_scales = array .pixel_scales ,
320+ origin = array .mask .mask_centre ,
262321 )
263322
264- return Array2D (values = arr , mask = mask , header = array . header )
323+ return Array2DRGB (values = array_2d_rgb . astype ( "int" ) , mask = mask )
0 commit comments