gpt4 book ai didi

bokeh - 如何在 Bokeh 中选择图像的区域

转载 作者:行者123 更新时间:2023-12-02 04:38:12 28 4
gpt4 key购买 nike

在Web应用程序中,我想让用户使用bokeh的漂亮的框/套索选择工具来选择绘制图像中的感兴趣区域。我想接收选定的像素,以便在python中进行进一步的操作。

对于散点图,这类似于gallery,很容易做到

import bokeh.plotting
import numpy as np

# data
X = np.linspace(0, 10, 20)
def f(x): return np.random.random(len(x))

# plot and add to document
fig = bokeh.plotting.figure(x_range=(0, 10), y_range=(0, 10),
tools="pan,wheel_zoom,box_select,lasso_select,reset")
plot = fig.scatter(X, f(X))
#plot = fig.image([np.random.random((10,10))*255], dw=[10], dh=[10])
bokeh.plotting.curdoc().add_root(fig)

# callback
def callback(attr, old, new):
# easily access selected points:
print sorted(new['1d']['indices'])
print sorted(plot.data_source.selected['1d']['indices'])
plot.data_source.data = {'x':X, 'y':f(X)}
plot.data_source.on_change('selected', callback)

但是,如果我将散点图替换为
plot = fig.image([np.random.random((10,10))*255], dw=[10], dh=[10])

然后在图像上使用选择工具不会更改 plot.data_source.selected中的任何内容。

我确定这是预期的行为(也很有意义),但是如果我要选择图像的像素怎么办?我当然可以在图像顶部放置一个看不见的散射点网格,但是有没有更优雅的方法来实现此目的?

最佳答案

听起来您正在寻找的工具实际上是BoxEditTool。请注意,BoxEditTool需要一个字形列表(通常是Rect实例),这些字形将呈现ROI,并且应使用以下命令设置侦听更改:

rect_glyph_source.on_change('data', callback)

每当您对ROI进行任何更改时,这都会触发 callback函数。

相关的ColumnDataSource实例(在此示例中为 rect_glyph_source)将被更新,以使“x”和“y”键列出图像坐标空间中每个ROI的中心,当然,“width”和“height”描述其大小。据我所知,目前还没有内置的方法来提取数据本身,因此您将必须执行以下操作:
rois = rect_glyph_source.data
roi_index = 0 # x, y, width and height are lists, and each ROI has its own index

x_center = rois['x'][roi_index]
width = rois['width'][roi_index]
y_center = rois['y'][roi_index]
height = rois['height'][roi_index]

x_start = int(x_center - 0.5 * width)
x_end = int(x_center + 0.5 * width)
y_start = int(y_center - 0.5 * height)
y_end = int(y_center + 0.5 * height)

roi_data = image_plot.source.data['image'][0][y_start:y_end, x_start:x_end]

重要:在Bokeh的当前版本(0.13.0)中,服务器上BoxEditTool的同步存在问题,并且无法正常工作。这应该在Bokeh的下一个正式版本中修复。有关更多信息和临时解决方案,请参见 this answerthis discussion

关于bokeh - 如何在 Bokeh 中选择图像的区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40038456/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com