gpt4 book ai didi

python - 如何暂停 for 循环并等待用户输入 matplotlib

转载 作者:太空宇宙 更新时间:2023-11-04 02:38:25 24 4
gpt4 key购买 nike

抱歉,我的问题标题不是很容易阅读。

这是我的问题。

我正在尝试拍摄图片文件并循环遍历每个像素。

我想在每个像素上显示像素文件图像的 matplotlib 图(完成。)

图形显示后,我需要暂停循环,同时用户通过按“b”或“c”对像素的颜色进行分类,然后使用空格键关闭图形。

完成此操作后,我希望它加载下一个像素。但是我遇到的问题是 for 循环不会暂停。如果我在 for 循环中放置一个 while 循环,图形永远不会完成加载(保持为白色屏幕,鼠标在其上滚动时转向加载圆圈)。

我是事件处理的新手,所以我可能缺少一些方法来执行此操作。

我也无法使用 matplotlibs 交互模式进行任何工作。

下面是我的代码,非常粗糙,我从今天早上才开始处理它。正在使用的类中的唯一方法是 init()。

from scipy.misc import imread
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

class images(object):

def __init__(self,img,flat=False,mod='RGB',show=True):
'File types to compare to'
file_type_list =['.jpg','.bmp','.gif','.png']
'Create assertion error if not right fiel type'
assert(any(img[-4:] for x in file_type_list)),"Wrong file formate please use: JPEG, BMP, GIF, or PNG"
'Read image file to numpy array'
self.img=imread(img,flatten=flat,mode=mod)
'Show image in matplotlib plot if selected by user'
if show == True:
fig, ax = plt.subplots()
ax.imshow(self.img)

def arr_to_vector(self):
'Convert 3D image array into 2D vector [no. pixels,3(RGB)]'
self.img_vector = self.img.reshape(-1,self.img.shape[2])
return self.img_vector

def gray_vector(self):
'Convert 3D image array into 1D vector [no. pixels in grayscale]'
img_vector = self.img.reshape(-1,self.img.shape[2])
self.g_img_vector = np.mean(img_vector,axis=1)
return self.g_img_vector

def plotter(self):
self.fig = plt.figure()
plt.imshow(self.img)

def disp_pixel(i):
tmp = allsamecolor(Img.img,i)
fig = plt.figure()
plt.imshow(tmp)
plt.show()
cid = fig.canvas.mpl_connect('key_press_event',on_key)
return fig.number, fig

def on_key(event):
if event.key == ' ':
plt.close(event.canvas.figure)
return event.key
else:
if event.key == 'b':
print(event.key)
labels.append('black')
elif event.key == 'c':
print(event.key)
labels.append('copper')

def assign(x,i):
x = i
return x

def allsamecolor(img, i):
fv = np.vectorize(assign)
ret = fv(img,i)
return ret

img = 'C:/Temp/test.jpg'

Img = images(img,show=False)

v = Img.arr_to_vector()

labels = []

n = 0
for i in v:
x, fig = disp_pixel(i)
print(x)
input("Press <ENTER> to continue")

最佳答案

以下是更新图形的示例,每次用户按下 Space 时都会显示新图像。然后用户需要按 br ,这取决于他在图片中看到的是更多的蓝色还是更多的红色。存储用户输入以及图像的平均值。 N 图像完成后,结果以图表形式显示。

这背后的想法是表明完整的代码可以在绘图窗口的事件循环中运行。

import numpy as np
import matplotlib.pyplot as plt

class Quest():
def __init__(self, N = 5, bias=0):
self.bias = bias
self.N = N
self.resImage = np.zeros(self.N)
self.resUser = np.zeros(self.N)
self.mapping = {"b" : -1,"r" : 1}

def start(self):
self.fig, self.ax = plt.subplots()
self.i = 0
self.im = self.ax.imshow(np.zeros((3,3)), norm=plt.Normalize(-1,1),cmap="bwr")
self.cid = self.fig.canvas.mpl_connect("key_press_event", self.user_input)
self.next_image()
plt.show()

def next_image(self):
im = self.generate_image()
self.resImage[self.i] = im.mean()
self.im.set_data(im)
self.fig.canvas.draw_idle()

def user_input(self, event=None):
if event.key == ' ':
if self.i < self.N-1:
self.i += 1
self.next_image()
else:
self.show_result()
elif event.key in self.mapping.keys():
self.resUser[self.i] = self.mapping[event.key.lower()]
else:
return

def show_result(self):
self.ax.clear()
self.ax.scatter(range(self.N), self.resImage, label="images")
self.ax.scatter(range(self.N), self.resUser, label="user")
self.ax.axhline(self.bias, color="k")
self.ax.legend()
self.fig.canvas.draw_idle()


def generate_image(self):
return np.random.normal(self.bias,0.7, size=(3,3))

q = Quest()
q.start()

关于python - 如何暂停 for 循环并等待用户输入 matplotlib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47273107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com