From 3a311c070f9c03bc124655ab1c31d6afef02db9d Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Wed, 9 Jun 2021 15:53:49 +0200 Subject: [PATCH] added binning for 2D images --- kabuki/actor.py | 16 +++++++++------- kabuki/cfgdlgs/cfgdlg2d.py | 5 +++-- kabuki/plots/plot2d.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/kabuki/actor.py b/kabuki/actor.py index 92d4fb6..22518a7 100644 --- a/kabuki/actor.py +++ b/kabuki/actor.py @@ -20,10 +20,10 @@ class Actor: cfg.sp_cache_size.on_change("value", cb(self.do_update_cache_size)) if isinstance(cfg, ConfigDialog1D): #TODO - cfg.curves_latest.active = plt.line_latest.visible + cfg.curves_latest.active = plt.line_latest.visible cfg.curves_average.active = plt.line_average.visible - cfg.error_bands.active = plt.errband_latest.visible - cfg.error_bars.active = plt.errbars_latest.visible + cfg.error_bands.active = plt.errband_latest.visible + cfg.error_bars.active = plt.errbars_latest.visible cfg.curves_latest.on_click(plt.show_curve_latest) cfg.curves_average.on_click(plt.show_curve_average) @@ -31,11 +31,13 @@ class Actor: cfg.error_bars.on_click(plt.show_error_bars) if isinstance(cfg, ConfigDialog2D): #TODO - cfg.sel_cmap.value = plt.palette + cfg.sel_cmap.value = plt.palette + cfg.sp_binning.value = plt.binning - cfg.sel_cmap.on_change("value", cb(plt.change_cmap)) - cfg.sp_vmin.on_change("value", cb(plt.change_vmin)) - cfg.sp_vmax.on_change("value", cb(plt.change_vmax)) + cfg.sel_cmap.on_change("value", cb(plt.change_cmap)) + cfg.sp_vmin.on_change("value", cb(plt.change_vmin)) + cfg.sp_vmax.on_change("value", cb(plt.change_vmax)) + cfg.sp_binning.on_change("value", cb(plt.change_binning)) def delete(self): diff --git a/kabuki/cfgdlgs/cfgdlg2d.py b/kabuki/cfgdlgs/cfgdlg2d.py index 81a22d9..61aab05 100644 --- a/kabuki/cfgdlgs/cfgdlg2d.py +++ b/kabuki/cfgdlgs/cfgdlg2d.py @@ -18,16 +18,17 @@ class ConfigDialog2D(Column): self.sel_cmap = sel_cmap = Select(title="Colormap", options=CMAPS) self.sp_vmin = sp_vmin = Spinner(title="Minimum Value") self.sp_vmax = sp_vmax = Spinner(title="Maximum Value") + self.sp_binning = sp_binning = Spinner(title="Binning", low=1) super().__init__( sp_cache_size, sel_cmap, - Row(sp_vmin, sp_vmax) + Row(sp_vmin, sp_vmax), + sp_binning ) #TODO: -#- binning #- log z diff --git a/kabuki/plots/plot2d.py b/kabuki/plots/plot2d.py index 86c8a84..3518c6b 100644 --- a/kabuki/plots/plot2d.py +++ b/kabuki/plots/plot2d.py @@ -16,6 +16,8 @@ class Plot2D(Object): self.source = source = ColumnDataSource(data=data) + self.binning = 1 + self.cmap = cmap = LinearColorMapper() self.change_cmap("Viridis") cbar = ColorBar(color_mapper=cmap) @@ -32,6 +34,7 @@ class Plot2D(Object): def set(self, _times, values): image = values[-1] + image = rebin(image, self.binning) self.source.data.update(image=[image]) @@ -45,5 +48,31 @@ class Plot2D(Object): def change_vmax(self, value): self.cmap.high = value + def change_binning(self, value): + self.binning = value + + + +def rebin(img, binning): + if binning == 1: + return img + + old_shape = np.array(img.shape) + new_ny, new_nx = new_shape = old_shape // binning + cut_shape = new_shape * binning + + left_ny, left_nx = offsets = (old_shape - cut_shape) // 2 + right_ny, right_nx = cut_shape + offsets + + meaning_shape = ( + new_ny, binning, + new_nx, binning + ) + + img = img[left_ny:right_ny, left_nx:right_nx] + img.shape = meaning_shape + img = img.mean(axis=(1, 3)) + return img +