首页 > 解决方案 > Interactive skimage viewer canvastools RectangleTool

问题描述

I've run into trouble with skimage.viewer.canvastools.RectangleTool() and would be grateful for any help that could be offered.

I would like the selection box to be interactive i.e. after drawing, one can edit the selected region using the handles. This feature appears to work with matplotlib.widgets.RectangleSelector()...e.g.

from matplotlib.widgets import  RectangleSelector
from pylab import *

def onselect(eclick, erelease):
  'Dummy function'

x = arange(100)/(99.0)
y = sin(x)
fig = figure
ax = subplot(111)
ax.plot(x,y)

test = RectangleSelector(ax, onselect,
                         drawtype='box',
                         interactive=True)
show()

However, with skimage.viewer.canvastools.RectangleTool()when I use

rect_tool = RectangleTool(viewer,
                      on_enter=save_region,
                      interactive=True) 

I'm thrown:

TypeError: init() got an unexpected keyword argument 'interactive'

...and if I use

rect_tool = RectangleTool(viewer,
                      on_enter=save_region,
                      rect_props=dict(interactive=True))  

I'm thrown this error:

AttributeError: Unknown property interactive

Have I misunderstood the manpage?

Many thanks!


This is where I am at (RectangleTool not interactive):

import skimage.io
from skimage.viewer import ImageViewer
from skimage.viewer.canvastools import RectangleTool

import numpy as np

from tkinter import Tk
from tkinter.filedialog import askopenfilename
from tkinter.simpledialog import askfloat


Tk().withdraw() # we don't want a full GUI, so keep the root window from appearing
filename = askopenfilename() # show an "Open" dialog box and return the path to the selected file
print(filename)

image_rgb = skimage.io.imread(filename)
image_r = image_rgb[:,:,0] # extract red channel


########
# Does this need to be initialised differently to make the rectangle interactive?
viewer = ImageViewer(image_r)


intensity_dumps = [] # used to store pixel values for selected regions

def save_region(extents):
    global image_r, intensity_dumps
    xmin = np.floor(extents[0]).astype('uint16')
    xmax = np.ceil(extents[1]).astype('uint16')
    ymin = np.floor(extents[2]).astype('uint16')
    ymax = np.ceil(extents[3]).astype('uint16')
    region = image_r[ymin:ymax,xmin:xmax]
    intensity_dumps.append(np.ndarray.flatten(region))
    print('Mean:',np.mean(region))
    print('Std. dev.:',np.std(region))
    print('Max:',np.max(region))


########
# Here is where I believe the problem lies...
rect_tool = RectangleTool(viewer,
                          on_enter=save_region)


thresholded = viewer.show()[0][0]

标签: pythonimage-processinginteractivescikit-imageviewer

解决方案


Yes, I think you have misunderstood. Notice that there is no interactive= argument to the RectangleTool. Instead, there is a rect_props argument, which is a dictionary. The dictionary items will be passed as keyword arguments to RectangleSelector. So you want: RectangleTool(..., rect_props=dict(interactive=True).


推荐阅读