Динамическое взаимодействие между Rectangle Selector и фигурой matplotlib - PullRequest
0 голосов
/ 26 мая 2019

Я работаю над интерактивной программой, которая отображает изображение и позволяет пользователю выбрать часть этого изображения с помощью RectangleSelector. Цель состоит в том, чтобы программа

  1. сначала отображает в реальном времени минимальное значение трех каналов в выбранной части изображения
  2. сохранить координаты прямоугольника, когда пользователь доволен им, чтобы программа продолжала

Поскольку мой программный проект большой и охватывает гораздо больше, я разделил его на несколько файлов. Вот они:

  • 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.

И вообще, я не знаю, как сохранить координаты прямоугольника, когда пользователь доволен этим. Может быть, пользователь должен прекратить касаться положения прямоугольника и его экстентов и нажать кнопку, чтобы продолжить выполнение программы (это связано с другой возникшей у меня проблемой)

PS: я дал здесь случайное изображение, которое я использовал в этом примере для моего вопроса.

...