Example #1
0
File: mask.py Project: daihui/pypad
 def mask2d(self):
     return utils.flatten_2x1s(self.mask)
Example #2
0
 def mask2d(self):
     return utils.flatten_2x1s( self.mask )
Example #3
0
File: mask.py Project: daihui/pypad
    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
Example #4
0
    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