简体   繁体   English

使用 Tkinter 显示来自 numpy 数组的图像

[英]Using Tkinter to display images from a numpy array

i'm inexperienced with Python and using Tkinter for the first time to make a UI that displays results of my digit classification program with the mnist dataset.我对 Python 没有经验,并且第一次使用 Tkinter 制作一个 UI,该 UI 显示我的数字分类程序和 mnist 数据集的结果。 I have a question about displaying images in Tkinter when they're from a numpy array rather than a filepath on my PC.我有一个关于在 Tkinter 中显示来自 numpy 数组而不是我 PC 上的文件路径的图像的问题。 The current code I have tried for this is:我为此尝试过的当前代码是:

    img = PhotoImage(test_images[0])
    window.create_image(20,20, image=img)

Which was unsuccessful, however i'm not sure how else to approach it.这是不成功的,但是我不知道如何处理它。 Below is a picture of the image plotted from the array that I would like to display in the UI, and below the image is just the code that shows how i'm loading and plotting the images in case that helps.下面是我想在 UI 中显示的从数组绘制的图像的图片,图像下方只是显示我如何加载和绘制图像的代码,以防万一。 Sorry if this is an easy fix that i'm missing, i'm very new to this.抱歉,如果这是我遗漏的简单修复,我对此很陌生。 Cheers干杯

https://i.gyazo.com/8962f16b4562c0c15c4ff79108656087.png https://i.gyazo.com/8962f16b4562c0c15c4ff79108656087.png

# Load the data set
train_images = mnist.train_images() #training data
train_labels = mnist.train_labels() #training labels
test_images = mnist.test_images() # training training images
test_labels = mnist.test_labels()# training data labels

# normalise the pixel values of the images to make the network easier to train
train_images = (train_images/255) - 0.5
test_images = (test_images/255) - 0.5
# Flatten the images in to a 784 dimensional vector to pass into the neural network
train_images = train_images.reshape((-1, 784))
test_images = test_images.reshape((-1, 784))
# Print shape of images
print(train_images.shape) # 60,000 rows and 784 columns
print(test_images.shape)
for i in range(0,15):
    first_image = test_images[i]
    first_image = np.array(first_image, dtype='float')
    pixels = first_image.reshape((28,28))
    plt.imshow(pixels)
    plt.show()

Error Message:错误信息:

Traceback (most recent call last):
  File "C:/Users/Ben/Desktop/Python Projects/newdigitclassifier/classifier.py", line 122, in <module>
    img = PhotoImage(test_images[0])
  File "C:\Users\Ben\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 3545, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "C:\Users\Ben\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 3491, in __init__
    if not name:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Here is the solution:这是解决方案:

import cv2
import tkinter as tk
from PIL import Image, ImageTk
import tensorflow as tf

# initializing window and image properties
HEIGHT = 200
WIDTH = 200
IMAGE_HEIGHT = 200
IMAGE_WIDTH = 200

# loading mnist dataset
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()

def imageShow(index):
    root = tk.Tk()
    # resizing image into larger image
    img_array = cv2.resize(x_train[index], (IMAGE_HEIGHT,IMAGE_WIDTH), interpolation = cv2.INTER_AREA)
    img =  ImageTk.PhotoImage(image=Image.fromarray(img_array))
    canvas = tk.Canvas(root,width=WIDTH,height=HEIGHT)
    canvas.pack()
    canvas.create_image(IMAGE_HEIGHT/2,IMAGE_WIDTH/2, image=img)
    root.mainloop()

imageShow(5)

The dataset have been imported from tensorflow.数据集是从 tensorflow 导入的。 I have added an extra feature to resize images.我添加了一个额外的功能来调整图像大小。 And the result looks like this结果看起来像这样

An implementation of a similar task that depends on numpy and TkInter only can be found here:可以在此处找到仅依赖于 numpy 和 TkInter 的类似任务的实现:

https://gist.github.com/FilipDominec/14761052f42d80d283bd3adcf7eb5347 https://gist.github.com/FilipDominec/14761052f42d80d283bd3adcf7eb5347

It is a "ripple tank simulator" example and I tried to optimize its speed as much as possible.这是一个“波纹坦克模拟器”的例子,我试图尽可能地优化它的速度。

It also allows for choosing color map, embossing, zooming in and out etc.它还允许选择颜色图、浮雕、放大和缩小等。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM