矩形选择器与 matplotlib 图之间的动态交互
Dynamic interaction between Rectangle Selector and a matplotlib figure
我正在开发一个交互式程序,它显示图像并让用户 select 通过 RectangleSelector
来查看该图像的一部分。目标是程序
- 首先,在图像selected部分实时显示三根管的最小值
- 当用户满意时保存矩形的坐标,以便程序继续
因为我的程序项目比较大,涉及的内容也比较多,所以我把它分成了几个文件。他们是:
- settings.py
import numpy as np
def init():
global img # image
global text_sig_red, text_sig_green, text_sig_blue
# text_sig_red, text_sig_green, text_sig_blue = '', '', ''
img = np.array([])
- functions.py
import numpy as np
import settings
def line_select_callback(eclick, erelease):
# 'eclick and erelease are the press and release events'
x1, y1 = int(eclick.xdata), int(eclick.ydata) # start position
x2, y2 = int(erelease.xdata), int(erelease.ydata) # end position
crop_img = settings.img[x1:x2,y1:y2]
#print('shape film temoin', np.shape(film_temoin))
sig_red = np.min(crop_img[:,:,0])
sig_green = np.min(crop_img[:,:,1])
sig_blue = np.min(crop_img[:,:,2])
text_red = 'min red signal' + str(sig_red)
text_green = 'min green signal' + str(sig_green)
text_blue = 'min blue signal' + str(sig_blue)
settings.text_sig_red.set_text(text_red)
settings.text_sig_green.set_text(text_green)
settings.text_sig_blue.set_text(text_blue)
def toggle_selector(event):
if event.key in ['Q', 'q'] and toggle_selector.RS.active:
toggle_selector.RS.set_active(False)
if event.key in ['A', 'a'] and not toggle_selector.RS.active:
toggle_selector.RS.set_active(True)
- main.py
import numpy as np
import matplotlib.image as mpim
import matplotlib.animation as animation
import matplotlib.patches as patches
from matplotlib.widgets import RectangleSelector
from matplotlib import pyplot as plt
import functions as fct
import settings
settings.init()
settings.img = mpim.imread('pattern.png')
fig, ax = plt.subplots(1, 1)
ax_red = plt.axes([0.05, 0.5, 0.05, 0.02])
ax_green = plt.axes([0.05, 0.3, 0.05, 0.02])
ax_blue = plt.axes([0.05, 0.1, 0.05, 0.02])
settings.text_sig_red = ax_red.text(0.5,0.5,"",transform=ax_red.transAxes)
settings.text_sig_green = ax_green.text(0.5,0.5,"",transform=ax_green.transAxes)
settings.text_sig_blue = ax_blue.text(0.5,0.5,"",transform=ax_blue.transAxes)
ax.imshow(settings.img)
fct.toggle_selector.RS = RectangleSelector(ax, fct.line_select_callback,
drawtype='box', useblit=True,
button=[1, 3], # don't use middle button
minspanx=5, minspany=5,
spancoords='pixels',
interactive=True,
rectprops=dict(facecolor='black',
edgecolor = 'black',
alpha=1.,
fill=None))
plt.connect('key_press_event', fct.toggle_selector)
plt.show()
目前,我的程序的目标 (1) 有问题。它不会动态显示文本 text_sig_red
。
实际上,当用户满意时,我不知道如何保存矩形的坐标。也许用户应该停止触摸矩形位置和范围并单击按钮以使程序继续(这是 linked 我遇到的另一个问题)
PS : 我已经给了 here 我在这个例子中用于我的问题的随机图像。
希望你的问题现在已经解决了,但如果没有:
您的目标 (1) 问题的根本原因是在初始 show() 之后该图从未明确更新。
因此,解决此问题的一种方法是将以下行添加到 functions.py 中的 line_select_callback 函数的末尾:
plt.gcf().canvas.draw()
(当然这个模块也需要引入plt)
关于您的其余问题,创建一个明显的交互(例如按钮)始终是一个不错的选择。
我正在开发一个交互式程序,它显示图像并让用户 select 通过 RectangleSelector
来查看该图像的一部分。目标是程序
- 首先,在图像selected部分实时显示三根管的最小值
- 当用户满意时保存矩形的坐标,以便程序继续
因为我的程序项目比较大,涉及的内容也比较多,所以我把它分成了几个文件。他们是:
- settings.py
import numpy as np
def init():
global img # image
global text_sig_red, text_sig_green, text_sig_blue
# text_sig_red, text_sig_green, text_sig_blue = '', '', ''
img = np.array([])
- functions.py
import numpy as np
import settings
def line_select_callback(eclick, erelease):
# 'eclick and erelease are the press and release events'
x1, y1 = int(eclick.xdata), int(eclick.ydata) # start position
x2, y2 = int(erelease.xdata), int(erelease.ydata) # end position
crop_img = settings.img[x1:x2,y1:y2]
#print('shape film temoin', np.shape(film_temoin))
sig_red = np.min(crop_img[:,:,0])
sig_green = np.min(crop_img[:,:,1])
sig_blue = np.min(crop_img[:,:,2])
text_red = 'min red signal' + str(sig_red)
text_green = 'min green signal' + str(sig_green)
text_blue = 'min blue signal' + str(sig_blue)
settings.text_sig_red.set_text(text_red)
settings.text_sig_green.set_text(text_green)
settings.text_sig_blue.set_text(text_blue)
def toggle_selector(event):
if event.key in ['Q', 'q'] and toggle_selector.RS.active:
toggle_selector.RS.set_active(False)
if event.key in ['A', 'a'] and not toggle_selector.RS.active:
toggle_selector.RS.set_active(True)
- main.py
import numpy as np
import matplotlib.image as mpim
import matplotlib.animation as animation
import matplotlib.patches as patches
from matplotlib.widgets import RectangleSelector
from matplotlib import pyplot as plt
import functions as fct
import settings
settings.init()
settings.img = mpim.imread('pattern.png')
fig, ax = plt.subplots(1, 1)
ax_red = plt.axes([0.05, 0.5, 0.05, 0.02])
ax_green = plt.axes([0.05, 0.3, 0.05, 0.02])
ax_blue = plt.axes([0.05, 0.1, 0.05, 0.02])
settings.text_sig_red = ax_red.text(0.5,0.5,"",transform=ax_red.transAxes)
settings.text_sig_green = ax_green.text(0.5,0.5,"",transform=ax_green.transAxes)
settings.text_sig_blue = ax_blue.text(0.5,0.5,"",transform=ax_blue.transAxes)
ax.imshow(settings.img)
fct.toggle_selector.RS = RectangleSelector(ax, fct.line_select_callback,
drawtype='box', useblit=True,
button=[1, 3], # don't use middle button
minspanx=5, minspany=5,
spancoords='pixels',
interactive=True,
rectprops=dict(facecolor='black',
edgecolor = 'black',
alpha=1.,
fill=None))
plt.connect('key_press_event', fct.toggle_selector)
plt.show()
目前,我的程序的目标 (1) 有问题。它不会动态显示文本 text_sig_red
。
实际上,当用户满意时,我不知道如何保存矩形的坐标。也许用户应该停止触摸矩形位置和范围并单击按钮以使程序继续(这是 linked 我遇到的另一个问题)
PS : 我已经给了 here 我在这个例子中用于我的问题的随机图像。
希望你的问题现在已经解决了,但如果没有:
您的目标 (1) 问题的根本原因是在初始 show() 之后该图从未明确更新。
因此,解决此问题的一种方法是将以下行添加到 functions.py 中的 line_select_callback 函数的末尾:
plt.gcf().canvas.draw()
(当然这个模块也需要引入plt)
关于您的其余问题,创建一个明显的交互(例如按钮)始终是一个不错的选择。