def _read_fit_image(path: Path): """ read FIT image from filesystem :param path: path to image file to load from :type path: pathlib.Path :return: the loaded image, with data and headers parsed or None if a known error occurred :rtype: Image or None """ try: with fits.open(str(path.resolve())) as fit: # pylint: disable=E1101 data = fit[0].data header = fit[0].header image = Image(data) if 'BAYERPAT' in header: image.bayer_pattern = header['BAYERPAT'] _set_image_file_origin(image, path) except OSError as error: _report_fs_error(path, error) return None return image
def _read_raw_image(path: Path): """ Reads a RAW DLSR image from file :param path: path to the file to read from :type path: pathlib.Path :return: the image or None if a known error occurred :rtype: Image or None """ try: with imread(str(path.resolve())) as raw_image: # in here, we make sure we store the bayer pattern as it would be advertised if image was a FITS image. # # lets assume image comes from a DSLR sensor with the most common bayer pattern. # # The actual/physical bayer pattern would look like a repetition of : # # +---+---+ # | R | G | # +---+---+ # | G | B | # +---+---+ # # RawPy will report the bayer pattern description as 2 discrete values : # # 1) raw_image.raw_pattern : a 2x2 numpy array representing the indices used to express the bayer patten # # in our example, its value is : # # +---+---+ # | 0 | 1 | # +---+---+ # | 3 | 2 | # +---+---+ # # and its flatten version is : # # [0, 1, 3, 2] # # 2) raw_image.color_desc : a bytes literal formed of the color of each pixel of the bayer pattern, in # ascending index order from raw_image.raw_pattern # # in our example, its value is : b'RGBG' # # We need to express/store this pattern in a more common way, i.e. as it would be described in a FITS # header. Or put simply, we want to express the bayer pattern as it would be described if # raw_image.raw_pattern was : # # +---+---+ # | 0 | 1 | # +---+---+ # | 2 | 3 | # +---+---+ bayer_pattern_indices = raw_image.raw_pattern.flatten() bayer_pattern_desc = raw_image.color_desc.decode() _LOGGER.debug(f"Bayer pattern indices = {bayer_pattern_indices}") _LOGGER.debug(f"Bayer pattern description = {bayer_pattern_desc}") assert len(bayer_pattern_indices) == len(bayer_pattern_desc) bayer_pattern = "" for i, index in enumerate(bayer_pattern_indices): assert bayer_pattern_indices[i] < len(bayer_pattern_indices) bayer_pattern += bayer_pattern_desc[index] _LOGGER.debug( f"Computed, FITS-compatible bayer pattern = {bayer_pattern}") new_image = Image(raw_image.raw_image_visible.copy()) new_image.bayer_pattern = bayer_pattern _set_image_file_origin(new_image, path) return new_image except LibRawNonFatalError as non_fatal_error: _report_fs_error(path, non_fatal_error) return None except LibRawFatalError as fatal_error: _report_fs_error(path, fatal_error) return None