Пример #1
0
    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
Пример #2
0
    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])
Пример #3
0
    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
Пример #4
0
    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
Пример #5
0
    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
Пример #6
0
    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