def main(self): # load previously calculated calibration and aligned data self.cfg.load_cal_data() if self._lfp_img_align is None: self.load_pickle_file() self.load_lfp_metadata() # micro image crop lfp_obj = LfpCropper(lfp_img_align=self._lfp_img_align, cfg=self.cfg, sta=self.sta) lfp_obj.main() self._lfp_img_align = lfp_obj.lfp_img_align del lfp_obj # rearrange light-field to sub-aperture images if self.cfg.params[self.cfg.opt_view]: lfp_obj = LfpRearranger(self._lfp_img_align, cfg=self.cfg, sta=self.sta) lfp_obj.main() self.vp_img_linear = lfp_obj.vp_img_arr del lfp_obj # remove outliers if option is set if self.cfg.params[self.cfg.opt_lier]: obj = LfpOutliers(vp_img_arr=self.vp_img_linear, cfg=self.cfg, sta=self.sta) obj.main() self.vp_img_linear = obj.vp_img_arr del obj # color equalization if self.cfg.params[self.cfg.opt_colo]: obj = LfpColorEqualizer(vp_img_arr=self.vp_img_linear, cfg=self.cfg, sta=self.sta) obj.main() self.vp_img_linear = obj.vp_img_arr del obj # copy light-field for refocusing process prior to contrast alignment and export self.vp_img_arr = self.vp_img_linear.copy() if self.vp_img_linear is not None else None # color management automation obj = LfpContrast(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta) obj.main() self.vp_img_arr = obj.vp_img_arr del obj # reduction of hexagonal sampling artifacts if self.cfg.params[self.cfg.opt_arti]: obj = HexCorrector(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta) obj.main() self.vp_img_arr = obj.vp_img_arr del obj # write viewpoint data to hard drive if self.cfg.params[self.cfg.opt_view]: obj = LfpExporter(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta) obj.write_viewpoint_data() del obj return True
def main(self): # rearrange light-field to viewpoint representation self.viewpoint_extraction() # histogram equalization if self.cfg.params[self.cfg.opt_cont]: obj = HistogramEqualizer(img=self.vp_img_arr) self.vp_img_arr = obj.lum_eq() #self.vp_img_arr = obj.awb_eq() del obj # colour and contrast handling obj = LfpContrast(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta, p_lo=0.0, p_hi=1.0) # contrast automation obj.contrast_bal() # automatic white balance if self.cfg.params[self.cfg.opt_awb_]: obj.auto_wht_bal() # automatic saturation if self.cfg.params[self.cfg.opt_sat_]: obj.sat_bal() self.vp_img_arr = obj.vp_img_arr del obj # remove hot pixels if option is set if self.cfg.params[self.cfg.opt_hotp]: obj = LfpHotPixels(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta) obj.main() self.vp_img_arr = obj.vp_img_arr del obj # write viewpoint data to hard drive if self.cfg.params[self.cfg.opt_view]: obj = LfpExporter(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta) obj.write_viewpoint_data() del obj # print status self.sta.progress(100, self.cfg.params[self.cfg.opt_prnt])
def shift_and_sum(self): # refocusing if not self.sta.interrupt: obj = LfpShiftAndSum(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta) obj.main() self.refo_stack = obj.refo_stack del obj # color management automation if not self.sta.interrupt: self.refo_stack = LfpContrast().auto_hist_align(self.refo_stack, ref_img=self.refo_stack[0], opt=True) self.refo_stack = GammaConverter().srgb_conv(img=self.refo_stack) # write refocused images to hard drive if not self.sta.interrupt: obj = LfpExporter(refo_stack=self.refo_stack, cfg=self.cfg, sta=self.sta) obj.export_refo_stack(file_type='png') obj.gif_refo() del obj
def refo_from_vp(self): """ computational refocusing based on viewpoint shift and integration """ # print status self.sta.progress(0, self.cfg.params[self.cfg.opt_prnt]) # initialize variables self._refo_stack = list() patch_len = self.cfg.params[self.cfg.ptc_leng] factor = self.cfg.params[self.cfg.ptc_leng] if self.cfg.params[ self.cfg.opt_refi] else 1 # divide intensity to prevent clipping in shift and sum process self._vp_img_arr /= patch_len # iterate through refocusing parameter a ran_refo = self.cfg.params[self.cfg.ran_refo] a_list = tuple([factor * a for a in ran_refo ]) if self.cfg.params[self.cfg.opt_refi] else ran_refo for a in range(*a_list): overlap = abs(a) * (patch_len - 1) img_slice = np.zeros( np.append( np.array(self._vp_img_arr.shape[2:-1]) * factor + [overlap, overlap], 3)) for j in range(patch_len): for i in range(patch_len): # perform sub-pixel refinement if required vp_img = misc.img_resize( self._vp_img_arr[j, i], factor) if factor > 1 else self._vp_img_arr[j, i] # get viewpoint padding for each border tb = (abs(a) * j, abs(a) * (patch_len - 1 - j) ) # top, bottom lr = (abs(a) * i, abs(a) * (patch_len - 1 - i) ) # left, right # flip padding for each axis if a is negative pad_width = (tb, lr, (0, 0)) if a >= 0 else (tb[::-1], lr[::-1], (0, 0)) # shift viewpoint image and add its values to refocused image slice img_slice = np.add(img_slice, np.pad(vp_img, pad_width, 'edge')) # check interrupt status if self.sta.interrupt: return False # print status percentage = ((j * patch_len + i + 1) / patch_len**2 + a - a_list[0]) / (a_list[-1] - a_list[0]) * 100 self.sta.progress(percentage, self.cfg.params[self.cfg.opt_prnt]) # crop refocused image for consistent image dimensions crop = int(overlap / 2) final_img = img_slice[crop:-crop, crop:-crop, :] if (a != 0) else img_slice # write upscaled version to hard drive if self.cfg.params[self.cfg.opt_refi]: upscale_img = LfpContrast().auto_hist_align(final_img.copy(), ref_img=final_img, opt=True) upscale_img = GammaConverter().srgb_conv(img=upscale_img) fname = np.round(a / patch_len, 2) LfpExporter(cfg=self.cfg, sta=self.sta).save_refo_slice(fname, upscale_img, string='upscale_') del upscale_img # spatially downscale image to original resolution (less memory required) final_img = misc.img_resize(final_img, 1. / factor) if factor > 1 else final_img self._refo_stack.append(final_img) return True
def main(self): self.cfg.load_cal_data() # micro image crop lfp_obj = LfpCropper(lfp_img_align=self._lfp_img_align, cfg=self.cfg, sta=self.sta) lfp_obj.main() self._lfp_img_align = lfp_obj.lfp_img_align del lfp_obj # viewpoint images if self.cfg.params[self.cfg.opt_view] and not self.sta.interrupt: lfp_obj = LfpRearranger(self._lfp_img_align, cfg=self.cfg, sta=self.sta) lfp_obj.main() self.vp_img_arr = lfp_obj.vp_img_arr del lfp_obj # histogram equalization if self.cfg.params[self.cfg.opt_cont] and not self.sta.interrupt: obj = HistogramEqualizer(img=self.vp_img_arr) self.vp_img_arr = obj.lum_eq() #self.vp_img_arr = obj.awb_eq() del obj # remove hot pixels if option is set if self.cfg.params[self.cfg.opt_hotp] and not self.sta.interrupt: obj = LfpHotPixels(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta) obj.main() self.vp_img_arr = obj.vp_img_arr del obj # color equalization if self.cfg.params[self.cfg.opt_colo] and not self.sta.interrupt: obj = LfpColorEqualizer(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta) obj.main() self.vp_img_arr = obj._vp_img_arr del obj if not self.sta.interrupt: obj = LfpContrast(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta, p_lo=0.005, p_hi=0.999) # automatic white balance if self.cfg.params[self.cfg.opt_awb_]: obj.auto_wht_bal() else: obj.channel_bal() obj.p_lo = 0 obj.p_hi = 1 # automatic saturation if self.cfg.params[self.cfg.opt_sat_]: obj.sat_bal() self.vp_img_arr = obj.vp_img_arr del obj # write viewpoint data to hard drive if self.cfg.params[self.cfg.opt_view] and not self.sta.interrupt: obj = LfpExporter(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta) obj.write_viewpoint_data() del obj return True
def main(self): self.cfg.load_cal_data() # micro image crop lfp_obj = LfpCropper(lfp_img_align=self._lfp_img_align, cfg=self.cfg, sta=self.sta) lfp_obj.main() self._lfp_img_align = lfp_obj.lfp_img_align del lfp_obj # rearrange light-field to sub-aperture images if self.cfg.params[self.cfg.opt_view] and not self.sta.interrupt: lfp_obj = LfpRearranger(self._lfp_img_align, cfg=self.cfg, sta=self.sta) lfp_obj.main() self.vp_img_arr = lfp_obj.vp_img_arr del lfp_obj # remove outliers if option is set if self.cfg.params[self.cfg.opt_lier] and not self.sta.interrupt: obj = LfpOutliers(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta) obj.main() self.vp_img_arr = obj.vp_img_arr del obj # color equalization if self.cfg.params[self.cfg.opt_colo] and not self.sta.interrupt: obj = LfpColorEqualizer(vp_img_arr=self.vp_img_arr, cfg=self.cfg, sta=self.sta) obj.main() self.vp_img_arr = obj.vp_img_arr del obj # copy light-field for refocusing process prior to contrast alignment and export vp_img_exp = self.vp_img_arr.copy() # color management automation if not self.sta.interrupt: obj = LfpContrast(vp_img_arr=vp_img_exp, cfg=self.cfg, sta=self.sta) obj.main() vp_img_exp = obj.vp_img_arr del obj # reduction of hexagonal sampling artifacts if self.cfg.params[self.cfg.opt_arti] and not self.sta.interrupt: obj = HexCorrector(vp_img_arr=vp_img_exp, cfg=self.cfg, sta=self.sta) obj.main() vp_img_exp = obj.vp_img_arr del obj # write viewpoint data to hard drive if self.cfg.params[self.cfg.opt_view] and not self.sta.interrupt: obj = LfpExporter(vp_img_arr=vp_img_exp, cfg=self.cfg, sta=self.sta) obj.write_viewpoint_data() del obj return True