使用滑块小部件以交互方式更改图像内容
Change content of image interactively using slider widgets
我正在尝试使用滑块以交互方式更改图像的内容(例如,应用具有不同内核大小的中值运算)。
虽然如果我只显示一张生成的图像(参见注释行)效果很好,但我 运行 在使用 subplot 函数时遇到麻烦,因为图像不会更新。
我错过了什么?
%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))
使用%matplotlib notebook
您可以使用笔记本后端而不是内联后端。这将允许按预期从 运行 代码调用 figure.canvas.draw()
作为脚本。将行 %matplotlib inline
替换为
%matplotlib notebook
并重启内核。
使用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));
输出将如下所示:
我正在尝试使用滑块以交互方式更改图像的内容(例如,应用具有不同内核大小的中值运算)。
虽然如果我只显示一张生成的图像(参见注释行)效果很好,但我 运行 在使用 subplot 函数时遇到麻烦,因为图像不会更新。
我错过了什么?
%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))
使用%matplotlib notebook
您可以使用笔记本后端而不是内联后端。这将允许按预期从 运行 代码调用 figure.canvas.draw()
作为脚本。将行 %matplotlib inline
替换为
%matplotlib notebook
并重启内核。
使用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));
输出将如下所示: