Updating bqplot image widget

687 Views Asked by At

I'm working on a project that uses ipywidgets and bqplot to display and interact with an image. Using ipywidgets and open cv I can modify an image, save it and update the value of the widget. But I also need the on_click_element aspect of bqplot, so I use the widget from the last one. I still have problems figuring out how to do the same thing with the widget in bqplot.

I would like to avoid to redraw the hole thing, but if needed it would have to close and redraw only the widget image since this is part of a bigger set of widgets. For example I would like to binarize the image using an arbitrary treshold.

From here I got the information on how to use the bqplot image widget: https://github.com/bqplot/bqplot/blob/master/examples/Marks/Object%20Model/Image.ipynb

I use something very similar to this to create the widget that I display.

from IPython.display import display
import ipywidgets as widgets
import bqplot as bq

with open('chelsea.png', 'rb') as f:
    raw_image = f.read()

ipyimage = widgets.Image(value=raw_image, format='png')
x_sc = bq.LinearScale()
y_sc = bq.LinearScale()
bq_image = bq.Image(image=ipyimage, scales={'x':x_sc, 'y':y_sc})
img_ani = bq.Figure(marks=[bq_image], animation_duration=400)
display(img_ani)

After this I can't update the figure without redrawing the hole thing. Any ideas?

jupyter 5.7.8, ipython 7.5.0, ipywidgets 7.5.1, bqplot 0.12.10

1

There are 1 best solutions below

1
On

Update the bqplot image mark by assigning a new image....

with open("chelsea2.png", 'rb') as f:
    raw_image2 = f.read()

# ipyimage.value =  raw_image2  # This doesn't seems to sync with widget display. Would require a redisplay of bqplot figure

# create new ipywidgets image and assign it to bqplot image
ipyimage2 = widgets.Image(value=raw_image2, format='png')
bq_image.image = ipyimage2