def mask2d(self): return utils.flatten_2x1s(self.mask)
def mask2d(self): return utils.flatten_2x1s( self.mask )
def __init__(self, raw_image, mask=None, filename='my_mask', fmt='pypad'): """ Instantiate an interactive masking session. Parameters ---------- raw_image : np.ndarray A shape (4, 8, 185, 388) array containing a reference image that the user will use to guide their masking. mask : padmask.PadMask A PadMask object to modify. If `None` (default), generate a new mask. filename : str The name of the file to generate at the end of the session. fmt : str The file format of `filename` to write. """ self.print_gui_help() self.filename = filename self.file_fmt = fmt if not raw_image.shape == (4, 16, 185, 194): raise ValueError("`raw_image` must have shape: (4, 16, 185, 194)") if mask == None: self.mask = PadMask() elif isinstance(mask, PadMask): self.mask = mask else: raise TypeError( '`mask` argument must be a pypad.mask.PadMask object') # inject a new mask type into our PadMask obj m = self.mask._blank_mask() if not 'manual' in self.mask._masks.keys(): self.mask._inject_mask('manual', m) # deal with negative values if not 'negatives' in self.mask._masks.keys(): self.mask._inject_mask('negatives', m.copy()) self.mask._masks['negatives'][raw_image <= 0.0] = 0 print "Masked: %d negative pixels" % np.sum( np.logical_not(self.mask._masks['negatives'])) # we're going to plot the log of the image, so do that up front self.raw_image_4d = raw_image self.raw_image = utils.flatten_2x1s(raw_image) self.log_image = self.raw_image.copy() self.log_image[self.log_image < 0.0] = 0.0 self.log_image = np.log10(self.log_image + 1.0) # populate an array containing the indices of all pixels in the image mg = np.meshgrid(np.arange(self.raw_image.shape[0]), np.arange(self.raw_image.shape[1])) self.points = np.vstack((mg[0].flatten(), mg[1].flatten())).T # create a colormap with masked pixels clearly highlighted self.palette = plt.cm.PuOr_r # reversed purple-orange -- base cm self.palette.set_under(color='green') # draw the main GUI, which is an image that can be interactively masked plt.figure(figsize=(9, 6)) self.ax = plt.subplot(111) self.im = self.ax.imshow( (self.log_image * self.mask.mask2d) - 1e-10, cmap=self.palette, origin='lower', interpolation='nearest', vmin=1e-10, aspect=1, extent=[0, self.log_image.shape[0], 0, self.log_image.shape[1]]) self.lc, = self.ax.plot((0, 0), (0, 0), '-+m', linewidth=1, markersize=8, markeredgewidth=1) self.lm, = self.ax.plot((0, 0), (0, 0), '-+m', linewidth=1, markersize=8, markeredgewidth=1) self.line_corner = (0, 0) self.xy = None self.lines_xy = None self.single_px = None # for masking single pixels self.colorbar = plt.colorbar(self.im, pad=0.01) self.colorbar.set_label(r'$\log_{10}$ Intensity') cidb = plt.connect('button_press_event', self.on_click) cidk = plt.connect('key_press_event', self.on_keypress) cidm = plt.connect('motion_notify_event', self.on_move) plt.xlim([0, self.log_image.shape[0]]) plt.ylim([0, self.log_image.shape[1]]) self.ax.get_xaxis().set_ticks([]) self.ax.get_yaxis().set_ticks([]) # add toggle buttons that allow the user to turn on and off std masks # I used to have this in its own nice function, but MPL didn't like # that for some reason... there is probably a better way, I just dont # know the innerds of MPL enough --TJL axcolor = 'lightgoldenrodyellow' ax1 = plt.axes([0.04, 0.7, 0.12, 0.08]) self.b1 = ToggleButton(ax1, 'nonbonded', color=axcolor, hovercolor='0.975') self.b1.on_turned_on(self.mask.mask_nonbonded) self.b1.on_turned_off(self.mask.remove_mask, 'nonbonded') self.b1.on_turned_on(self.update_image) self.b1.on_turned_off(self.update_image) ax2 = plt.axes([0.04, 0.6, 0.12, 0.08]) self.b2 = ToggleButton(ax2, 'row 13', color=axcolor, hovercolor='0.975') self.b2.on_turned_on(self.mask.mask_row13) self.b2.on_turned_off(self.mask.remove_mask, 'row13') self.b2.on_turned_on(self.update_image) self.b2.on_turned_off(self.update_image) ax3 = plt.axes([0.04, 0.5, 0.12, 0.08]) self.b3 = ToggleButton(ax3, 'borders', color=axcolor, hovercolor='0.975') self.b3.on_turned_on(self._set_borderwidth) self.mask_border_cid = self.b3.on_turned_on(self.mask.mask_borders) self.b3.on_turned_off(self.mask.remove_mask, 'border') self.b3.on_turned_on(self.update_image) self.b3.on_turned_off(self.update_image) ax4 = plt.axes([0.04, 0.4, 0.12, 0.08]) self.b4 = ToggleButton(ax4, 'threshold', color=axcolor, hovercolor='0.975') self.b4.on_turned_on(self._set_threshold) self.mask_threshold_cid = self.b4.on_turned_on( self.mask.mask_threshold, self.raw_image_4d, None, None) self.b4.on_turned_off(self.mask.remove_mask, 'threshold') self.b4.on_turned_on(self.update_image) self.b4.on_turned_off(self.update_image) plt.show() return
def __init__(self, raw_image, mask=None, filename='my_mask', fmt='pypad'): """ Instantiate an interactive masking session. Parameters ---------- raw_image : np.ndarray A shape (4, 8, 185, 388) array containing a reference image that the user will use to guide their masking. mask : padmask.PadMask A PadMask object to modify. If `None` (default), generate a new mask. filename : str The name of the file to generate at the end of the session. fmt : str The file format of `filename` to write. """ self.print_gui_help() self.filename = filename self.file_fmt = fmt if not raw_image.shape == (4, 16, 185, 194): raise ValueError("`raw_image` must have shape: (4, 16, 185, 194)") if mask == None: self.mask = PadMask() elif isinstance(mask, PadMask): self.mask = mask else: raise TypeError('`mask` argument must be a pypad.mask.PadMask object') # inject a new mask type into our PadMask obj m = self.mask._blank_mask() if not 'manual' in self.mask._masks.keys(): self.mask._inject_mask('manual', m) # deal with negative values if not 'negatives' in self.mask._masks.keys(): self.mask._inject_mask('negatives', m.copy()) self.mask._masks['negatives'][raw_image <= 0.0] = 0 print "Masked: %d negative pixels" % np.sum(np.logical_not(self.mask._masks['negatives'])) # we're going to plot the log of the image, so do that up front self.raw_image_4d = raw_image self.raw_image = utils.flatten_2x1s(raw_image) self.log_image = self.raw_image.copy() self.log_image[self.log_image < 0.0] = 0.0 self.log_image = np.log10(self.log_image + 1.0) # populate an array containing the indices of all pixels in the image mg = np.meshgrid( np.arange(self.raw_image.shape[0]), np.arange(self.raw_image.shape[1]) ) self.points = np.vstack((mg[0].flatten(), mg[1].flatten())).T # create a colormap with masked pixels clearly highlighted self.palette = plt.cm.PuOr_r # reversed purple-orange -- base cm self.palette.set_under(color='green') # draw the main GUI, which is an image that can be interactively masked plt.figure(figsize=(9,6)) self.ax = plt.subplot(111) self.im = self.ax.imshow( (self.log_image * self.mask.mask2d) - 1e-10, cmap=self.palette, origin='lower', interpolation='nearest', vmin=1e-10, aspect=1, extent=[0, self.log_image.shape[0], 0, self.log_image.shape[1]] ) self.lc, = self.ax.plot((0,0),(0,0),'-+m', linewidth=1, markersize=8, markeredgewidth=1) self.lm, = self.ax.plot((0,0),(0,0),'-+m', linewidth=1, markersize=8, markeredgewidth=1) self.line_corner = (0,0) self.xy = None self.lines_xy = None self.single_px = None # for masking single pixels self.colorbar = plt.colorbar(self.im, pad=0.01) self.colorbar.set_label(r'$\log_{10}$ Intensity') cidb = plt.connect('button_press_event', self.on_click) cidk = plt.connect('key_press_event', self.on_keypress) cidm = plt.connect('motion_notify_event', self.on_move) plt.xlim([0, self.log_image.shape[0]]) plt.ylim([0, self.log_image.shape[1]]) self.ax.get_xaxis().set_ticks([]) self.ax.get_yaxis().set_ticks([]) # add toggle buttons that allow the user to turn on and off std masks # I used to have this in its own nice function, but MPL didn't like # that for some reason... there is probably a better way, I just dont # know the innerds of MPL enough --TJL axcolor = 'lightgoldenrodyellow' ax1 = plt.axes([0.04, 0.7, 0.12, 0.08]) self.b1 = ToggleButton(ax1, 'nonbonded', color=axcolor, hovercolor='0.975') self.b1.on_turned_on(self.mask.mask_nonbonded) self.b1.on_turned_off(self.mask.remove_mask, 'nonbonded') self.b1.on_turned_on(self.update_image) self.b1.on_turned_off(self.update_image) ax2 = plt.axes([0.04, 0.6, 0.12, 0.08]) self.b2 = ToggleButton(ax2, 'row 13', color=axcolor, hovercolor='0.975') self.b2.on_turned_on(self.mask.mask_row13) self.b2.on_turned_off(self.mask.remove_mask, 'row13') self.b2.on_turned_on(self.update_image) self.b2.on_turned_off(self.update_image) ax3 = plt.axes([0.04, 0.5, 0.12, 0.08]) self.b3 = ToggleButton(ax3, 'borders', color=axcolor, hovercolor='0.975') self.b3.on_turned_on(self._set_borderwidth) self.mask_border_cid = self.b3.on_turned_on(self.mask.mask_borders) self.b3.on_turned_off(self.mask.remove_mask, 'border') self.b3.on_turned_on(self.update_image) self.b3.on_turned_off(self.update_image) ax4 = plt.axes([0.04, 0.4, 0.12, 0.08]) self.b4 = ToggleButton(ax4, 'threshold', color=axcolor, hovercolor='0.975') self.b4.on_turned_on(self._set_threshold) self.mask_threshold_cid = self.b4.on_turned_on(self.mask.mask_threshold, self.raw_image_4d, None, None) self.b4.on_turned_off(self.mask.remove_mask, 'threshold') self.b4.on_turned_on(self.update_image) self.b4.on_turned_off(self.update_image) plt.show() return