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

tfv*_*tfv 5 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)) 
Run Code Online (Sandbox Code Playgroud)

Imp*_*est 7

使用 %matplotlib notebook

您可以使用笔记本电脑后端而不是嵌入式后端。这将允许figure.canvas.draw()按预期方式通过将代码作为脚本运行来进行调用。更换线%matplotlib inline通过

%matplotlib notebook
Run Code Online (Sandbox Code Playgroud)

并重新启动内核。

在此处输入图片说明

使用 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")
Run Code Online (Sandbox Code Playgroud)

在一个新的单元格中

interact(f, Median_Size=widgets.IntSlider(min=1,max=21,step=2,value=1));
Run Code Online (Sandbox Code Playgroud)

输出将如下所示: 在此处输入图片说明