python - 矩形选择器和matplotlib图形之间的动态交互
问题描述
我正在开发一个交互式程序,该程序显示图像并让用户通过RectangleSelector
. 目标是该程序
- 首先,实时显示图像选定部分的三个运河的最小值
- 当用户满意时保存矩形的坐标,以便程序继续
因为我的程序项目很大并且涵盖的范围远不止这些,所以我将它分成了几个文件。他们是:
- 设置.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([])
- 函数.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)
- 主文件
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
。
实际上,当用户满意时,我不知道如何保存矩形的坐标。也许用户应该停止触摸矩形位置和范围并单击一个按钮以使程序继续(这与我遇到的另一个问题有关)
PS:我在这里给出了我在这个例子中用于我的问题的随机图像。
解决方案
希望您的问题现在已经解决,但如果没有:
目标 (1) 问题的根本原因是该图形在初始 show() 之后从未显式更新。
因此,解决此问题的一种方法是将以下行添加到 functions.py 中 line_select_callback 函数的末尾:
plt.gcf().canvas.draw()
(当然 plt 也需要在这个模块中导入)
关于您问题的其余部分,创建一个明显的交互(例如按钮)始终是一个不错的选择。
推荐阅读
- compiler-errors - C++ 从“int”到“int*”的无效转换
- loopbackjs - 是否可以在远程挂钩中执行 models.find() ?
- facebook - 如何在生产 Facebook 页面中进行测试,测试数据仅显示给应用程序的测试人员
- c - if 语句中的逻辑运算符
- c - 将字符串数组添加到c中的字符指针
- html - 为什么 display:inline-block 对齐不符合预期
- tensorflow - 如何使用 tensorflow 1.14 为 keras 层定义自定义渐变
- excel - How to detect 3 consecutive empty rows in excel
- javascript - 注册 ServiceWorker 时如何修复 404 错误?
- r - 当在 for 循环中以编程方式调用块时,Knitr 不打印 ggplots