44
55if TYPE_CHECKING :
66 from autoarray .structures .arrays .uniform_2d import Array2D
7+ from autoarray .structures .arrays .rgb import Array2DRGB
78 from autoarray .mask .mask_2d import Mask2D
89
10+
911from autoarray .structures .arrays import array_2d_util
1012from autoarray .structures .grids import grid_2d_util
1113
@@ -242,8 +244,12 @@ def array_2d_from(self, array: Array2D, buffer: int = 1) -> Array2D:
242244 The number pixels around the extracted array used as a buffer.
243245 """
244246 from autoarray .structures .arrays .uniform_2d import Array2D
247+ from autoarray .structures .arrays .rgb import Array2DRGB
245248 from autoarray .mask .mask_2d import Mask2D
246249
250+ if isinstance (array , Array2DRGB ):
251+ return self .array_2d_rgb_from (array = array , buffer = buffer )
252+
247253 extracted_array_2d = array_2d_util .extracted_array_2d_from (
248254 array_2d = np .array (array .native ),
249255 y0 = self .region [0 ] - buffer ,
@@ -269,3 +275,53 @@ def array_2d_from(self, array: Array2D, buffer: int = 1) -> Array2D:
269275 arr = array_2d_util .convert_array_2d (array_2d = extracted_array_2d , mask_2d = mask )
270276
271277 return Array2D (values = arr , mask = mask , header = array .header )
278+
279+ def array_2d_rgb_from (self , array : Array2DRGB , buffer : int = 1 ) -> Array2DRGB :
280+ """
281+ Extract the 2D region of an RGB array corresponding to the rectangle encompassing all unmasked values.
282+
283+ This works the same as the `array_2d_from` method, but for RGB arrays, meaning that it iterates over the three
284+ channels of the RGB array and extracts the region for each channel separately.
285+
286+ This is used to extract and visualize only the region of an RGB image that is used in an analysis.
287+
288+ Parameters
289+ ----------
290+ buffer
291+ The number pixels around the extracted array used as a buffer.
292+ """
293+ from autoarray .structures .arrays .rgb import Array2DRGB
294+ from autoarray .mask .mask_2d import Mask2D
295+
296+ for i in range (3 ):
297+
298+ extracted_array_2d = array_2d_util .extracted_array_2d_from (
299+ array_2d = np .array (array .native [:, :, i ]),
300+ y0 = self .region [0 ] - buffer ,
301+ y1 = self .region [1 ] + buffer ,
302+ x0 = self .region [2 ] - buffer ,
303+ x1 = self .region [3 ] + buffer ,
304+ )
305+
306+ if i == 0 :
307+ array_2d_rgb = np .zeros (
308+ (extracted_array_2d .shape [0 ], extracted_array_2d .shape [1 ], 3 )
309+ )
310+
311+ array_2d_rgb [:, :, i ] = extracted_array_2d
312+
313+ extracted_mask_2d = array_2d_util .extracted_array_2d_from (
314+ array_2d = np .array (self .mask ),
315+ y0 = self .region [0 ] - buffer ,
316+ y1 = self .region [1 ] + buffer ,
317+ x0 = self .region [2 ] - buffer ,
318+ x1 = self .region [3 ] + buffer ,
319+ )
320+
321+ mask = Mask2D (
322+ mask = extracted_mask_2d ,
323+ pixel_scales = array .pixel_scales ,
324+ origin = array .mask .mask_centre ,
325+ )
326+
327+ return Array2DRGB (values = array_2d_rgb .astype ("int" ), mask = mask )
0 commit comments