python - 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]
解决方案
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)
.
推荐阅读
- java - 在java中的递归链表中搜索项目的索引
- c# - Excel 互操作,Excel 的挥之不去的实例
- mysql - 即使我更改用户设置,用户 'username'@'localhost' 的访问也被拒绝
- python - 使用 cx_Freeze 冻结 Python 3.7 脚本时如何修复错误
- javascript - 如何在不将局部视图附加到控制器的情况下将局部视图加载到 div 中?
- java - Java SQLite ResultSet 不返回任何内容
- python - django基于pk更新数据库
- dart - 飞镖指数Where表现
- r - 在 R 中以数学方式操作向量/对象的特定元素
- emv - EMV 问题 : 发卡行除了 AC 信息之外还需要哪些数据来验证我的卡?