def decode_raw(self): # read bytes from file raw_data = list(self.file.read()) if len(raw_data) >= int(7728 * 5368 * 10 / 8): self.cfg.lfpimg['bit'] = 10 img_size = [7728, 5368] self.cfg.lfpimg['bay'] = 'GRBG' elif len(raw_data) >= int(3280**2 * 10 / 8): self.cfg.lfpimg['bit'] = 12 img_size = [3280, 3280] self.cfg.lfpimg['bay'] = 'BGGR' else: raise LfpTypeError('File type not recognized') # perform color filter array management and obtain rgb image cfa_obj = CfaProcessor(img_buf=raw_data, shape=img_size, cfg=self.cfg, sta=self.sta) cfa_obj.main() self._rgb_img = cfa_obj.rgb_img del cfa_obj return True
def filter_json(json_dict): ''' filter LFP metadata settings ''' # variable init settings = {} channels = ['b', 'r', 'gb', 'gr'] # filter camera serial and model serial = safe_get(json_dict, "camera", "serialNumber") cam_model = serial if serial else safe_get(json_dict, "camera", "model") # set decode paramaters considering camera model if cam_model.startswith(('A', 'F')): # 1st generation Lytro # read bit packing settings['bit'] = safe_get(json_dict, "image", "rawDetails", "pixelPacking", "bitsPerPixel") if not settings['bit'] == 12: raise AssertionError('Unrecognized bit packing format') # get Bayer pattern, Automatic White Balance (AWB) gains and Color Correction Matrix (CCM) settings['bay'] = 'BGGR' settings['awb'] = [ safe_get(json_dict, 'image', 'color', 'whiteBalanceGain', key) for key in channels ] settings['ccm'] = safe_get(json_dict, 'image', 'color', 'ccmRgbToSrgbArray') settings['gam'] = safe_get(json_dict, 'image', 'color', 'gamma') elif cam_model.startswith(('B', 'I')): # 2nd generation Lytro # read bit packing settings['bit'] = safe_get(json_dict, "image", "pixelPacking", "bitsPerPixel") if not settings['bit'] == 10: raise AssertionError('Unrecognized bit packing format') # get Bayer pattern, Automatic White Balance (AWB) gains and Color Correction Matrix (CCM) settings['bay'] = 'GRBG' settings['awb'] = [ safe_get(json_dict, 'algorithms', 'awb', 'computed', 'gain', key) for key in channels ] settings['ccm'] = safe_get(json_dict, 'image', 'color', 'ccm') settings['gam'] = safe_get(json_dict, 'master', 'picture', 'frameArray', 0, 'frame', 'metadata', 'image', 'color', 'gamma') else: raise LfpTypeError('Camera type not recognized') return settings
def main(self): # check interrupt status if self.sta.interrupt: return False if self._lfp_path.lower().endswith(SUPP_FILE_EXT): try: self.decode_lytro_file() except FileNotFoundError: # print status self.sta.status_msg( '{0} not found'.format(os.path.basename(self._lfp_path)), self.cfg.params[self.cfg.opt_prnt]) self.sta.progress(100, self.cfg.params[self.cfg.opt_prnt]) self.sta.error = True except Exception as e: # unrecognized LFP file type if not self._json_dict: raise LfpTypeError(e) else: raise PlenopticamError(e) else: try: # read and decode generic image file type self._lfp_img = misc.load_img_file(self._lfp_path) # inverse sRGB conversion self._lfp_img = GammaConverter().srgb_conv(self._lfp_img, inverse=True) except TypeError: self.sta.status_msg('File type not recognized') self.sta.error = True return False try: # try to load json file (if present) json_dict = self.cfg.load_json(self._lfp_path) self.cfg.lfpimg = LfpDecoder.filter_lfp_json( json_dict, self.cfg.lfp_img) except: pass # write json file self.cfg.save_params() return True
def main(self): if self._lfp_path.endswith(('.lfp', '.lfr', '.raw') + tuple('.c.'+str(num) for num in (0, 1, 2, 3))): # filename and file path from previously decoded data dp = os.path.splitext(self._lfp_path)[0] fn = os.path.basename(dp)+'.tiff' fp = os.path.join(dp, fn) # load previously generated tiff if present if os.path.exists(fp): try: self._lfp_img = misc.load_img_file(fp) except TypeError as e: self.sta.status_msg(e, self.cfg.params[self.cfg.opt_prnt]) self.sta.progress(100, self.cfg.params[self.cfg.opt_prnt]) raise LfpTypeError(e) except FileNotFoundError as e: # print status self.sta.status_msg('File {0} not found'.format(self._lfp_path), self.cfg.params[self.cfg.opt_prnt]) self.sta.progress(100, self.cfg.params[self.cfg.opt_prnt]) raise PlenopticamError(e) else: try: # Lytro type decoding with open(self._lfp_path, mode='rb') as file: # print status self.sta.status_msg('Decode Lytro image file', self.cfg.params[self.cfg.opt_prnt]) self.sta.progress(None, self.cfg.params[self.cfg.opt_prnt]) # LFC and raw type decoding obj = LfpDecoder(file, self.cfg, self.sta) if self._lfp_path.endswith(('.lfp', '.lfr') + tuple('.c.'+str(num) for num in (0, 1, 2, 3))): # LFC type decoding obj.decode_lfc() self.cfg.save_json(os.path.join(dp, os.path.basename(dp)+'.json'), json_dict=obj.json_dict) elif self._lfp_path.endswith('.raw'): # raw type decoding obj.decode_raw() self._lfp_img = obj.rgb_img del obj # save bayer image as file misc.save_img_file(misc.uint16_norm(self._lfp_img), fp, type='tiff') # print status self.sta.progress(100, self.cfg.params[self.cfg.opt_prnt]) except FileNotFoundError as e: # print status self.sta.status_msg('File {0} not found'.format(self._lfp_path), self.cfg.params[self.cfg.opt_prnt]) self.sta.progress(100, self.cfg.params[self.cfg.opt_prnt]) raise PlenopticamError(e) else: try: # read and decode generic image file type self._lfp_img = misc.load_img_file(self._lfp_path) except TypeError as e: raise LfpTypeError(e) try: # try to load json file (if present) json_dict = self.cfg.load_json(self._lfp_path) self.cfg.lfpimg = LfpDecoder.filter_json(json_dict) except: pass # write json file self.cfg.save_params() return True
def main(self): if self._lfp_path.lower().endswith(SUPP_FILE_EXT): # filename and file path from previously decoded data dp = os.path.splitext(self._lfp_path)[0] fn = os.path.basename(dp) + '.tiff' fp = os.path.join(dp, fn) # load previously generated tiff if present if os.path.exists(fp): try: self._lfp_img = misc.load_img_file(fp) except FileNotFoundError: # print status self.sta.status_msg( '{0} not found'.format(os.path.basename( self._lfp_path)), self.cfg.params[self.cfg.opt_prnt]) self.sta.progress(100, self.cfg.params[self.cfg.opt_prnt]) self.sta.error = True except TypeError as e: self.sta.status_msg(e, self.cfg.params[self.cfg.opt_prnt]) self.sta.progress(100, self.cfg.params[self.cfg.opt_prnt]) raise LfpTypeError(e) else: try: # Lytro type decoding with open(self._lfp_path, mode='rb') as file: # LFC and raw type decoding obj = LfpDecoder(file, self.cfg, self.sta) if self._lfp_path.lower().endswith(SUPP_FILE_EXT[1:]): # LFC type decoding obj.decode_lfc() self.cfg.save_json(os.path.join( dp, os.path.basename(dp) + '.json'), json_dict=obj.json_dict) elif self._lfp_path.lower().endswith(SUPP_FILE_EXT[0]): # raw type decoding obj.decode_raw() self._lfp_img = obj.rgb_img del obj # save bayer image as file self.sta.status_msg( msg='Save raw image', opt=self.cfg.params[self.cfg.opt_prnt]) self.sta.progress(None, self.cfg.params[self.cfg.opt_prnt]) misc.save_img_file(misc.Normalizer( self._lfp_img).uint16_norm(), fp, file_type='tiff') self.sta.progress(100, self.cfg.params[self.cfg.opt_prnt]) except FileNotFoundError: # print status self.sta.status_msg( '{0} not found'.format(os.path.basename( self._lfp_path)), self.cfg.params[self.cfg.opt_prnt]) self.sta.progress(100, self.cfg.params[self.cfg.opt_prnt]) self.sta.error = True except Exception as e: # unrecognized LFP file type if not obj.json_dict: raise LfpTypeError(e) else: raise PlenopticamError(e) else: try: # read and decode generic image file type self._lfp_img = misc.load_img_file(self._lfp_path) except TypeError as e: raise LfpTypeError(e) try: # try to load json file (if present) json_dict = self.cfg.load_json(self._lfp_path) self.cfg.lfpimg = LfpDecoder.filter_json(json_dict) except: pass # write json file self.cfg.save_params() return True