使用滑块小部件以交互方式更改图像内容

时间:2018-01-19 06:22:04

标签: python matplotlib ipython jupyter-notebook

我正在尝试使用滑块交互式地更改图像的内容(例如,用于应用具有不同内核大小的中值操作)。

虽然如果我只显示一个结果图像(参见注释行),这很有效,但是在使用子图功能时会遇到麻烦,因为图像不会更新。

我错过了什么?

%matplotlib inline
from ipywidgets import interact, widgets
import matplotlib.pyplot as plt
import warnings

from skimage.morphology import disk
from skimage.filters import rank
from skimage.color import rgb2gray
import skimage.data


def f(Median_Size):
    selem = disk(int(Median_Size))
    with warnings.catch_warnings():
        warnings.simplefilter("ignore")
        img_median = rank.median(img_gray, selem=selem) 

    ax_neu.imshow(img_median, cmap="gray")
    fig.canvas.draw()
    #plt.imshow(img_median, cmap="gray") #This would work
    #plt.show()

image = skimage.data.camera() #plt.imread("Test.png")       
img_gray = rgb2gray(image)

fig = plt.figure(figsize=(6, 4))
ax_orig = fig.add_subplot(121) 
ax_neu = fig.add_subplot(122) 

ax_orig.imshow(img_gray, cmap="gray")
ax_neu.imshow(img_gray, cmap="gray")

interact(f, Median_Size=widgets.IntSlider(min=1,max=21,step=2,value=1)) 

1 个答案:

答案 0 :(得分:4)

使用%matplotlib notebook

您可以使用笔记本后端,而不是内联后端。这将允许按照预期的方式调用figure.canvas.draw()作为脚本运行代码。将行%matplotlib inline替换为

%matplotlib notebook

并重新启动内核。

enter image description here

使用display

更改后的新数字可能会display %%capture %matplotlib inline from ipywidgets import interact, widgets from IPython.display import display import matplotlib.pyplot as plt import warnings from skimage.morphology import disk from skimage.filters import rank from skimage.color import rgb2gray import skimage.data def f(Median_Size): selem = disk(int(Median_Size)) with warnings.catch_warnings(): warnings.simplefilter("ignore") img_median = rank.median(img_gray, selem=selem) ax_neu.imshow(img_median, cmap="gray") fig.canvas.draw() display(fig) image = skimage.data.camera() #plt.imread("Test.png") img_gray = rgb2gray(image) fig = plt.figure(figsize=(6, 4)) ax_orig = fig.add_subplot(121) ax_neu = fig.add_subplot(122) ax_orig.imshow(img_gray, cmap="gray") ax_neu.imshow(img_gray, cmap="gray") 。缺点是它会产生两次输出。然后解决方法是将交互放在新单元格中并捕获第一个单元格的输出。

interact(f, Median_Size=widgets.IntSlider(min=1,max=21,step=2,value=1));

在新单元格中

-rw-r--r-- 1 lhn2 lhn2 670 Jan 19 10:21 index.php
-rw-r--r-- 1 lhn2 lhn2  32 Jan 19 10:19 stylesheet.css

输出看起来如下: enter image description here