Я работаю над интерактивной программой, которая отображает изображение и позволяет пользователю выбрать часть этого изображения с помощью RectangleSelector
. Цель состоит в том, чтобы программа
- сначала отображает в реальном времени минимальное значение трех каналов в выбранной части изображения
- сохранить координаты прямоугольника, когда пользователь доволен им, чтобы программа продолжала
Поскольку мой программный проект большой и охватывает гораздо больше, я разделил его на несколько файлов. Вот они:
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([])
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: я дал здесь случайное изображение, которое я использовал в этом примере для моего вопроса.