关于python:使用OpenCV读取图像并用Tkinter显示

我在Ubuntu 14.04 LTS上有一个非常简单的程序,可以使用OpenCV读取和显示图像:

1
2
3
4
5
6
import cv2 #import OpenCV

img = cv2.imread('picture.jpg'#read a picture using OpenCV
cv2.imshow('image',img# Display the picture
cv2.waitKey(0# wait for closing
cv2.destroyAllWindows(# Ok, destroy the window

我的问题:

如何在OpenCV中继续读取图片,但使用Tkinter进行显示?

我问这个问题是因为我想为我的程序创建一个接口,但是OpenCV无法做到这一点,因此我需要Tkinter。 但是,所有图像处理我都必须使用OpenCV在后台进行。 仅显示结果必须使用Tkinter完成。

编辑:

从上面的答案,我改变了这一行:

1
im = Image.open('slice001.hrs').convert2byte()

至:

1
im=cv2.imread(# (I imported cv2)

但是我有一个错误。

我将不胜感激。

您可能要看一看。 这对我有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np
import cv2
import Tkinter
import Image, ImageTk

# Load an color image
img = cv2.imread('img.png')

#Rearrang the color channel
b,g,r = cv2.split(img)
img = cv2.merge((r,g,b))

# A root window for displaying objects
root Tkinter.Tk()  

# Convert the Image object into a TkPhoto object
im = Image.fromarray(img)
imgtk = ImageTk.PhotoImage(image=im)

# Put it in the display window
Tkinter.Label(root, image=imgtk).pack()

root.mainloop(# Start the GUI

 

  • 谢谢。但是我看不到您在哪里使用OpenCV读取图像?
  • 只需编辑答案即可。但是,伙计们,您为什么不自己尝试一下呢? DIY-那是学习的最佳方式。
  • 我尝试过(请参阅我的编辑)。您的第二个解决方案几乎可以正常工作。但是,只有一个缺点:我的图像几乎是橙色的,但是现在几乎以蓝色显示了:(
  • 我添加了RGB模式以像这样im = Image.fromarray(img,RGB)读取它,但结果相同:(
  • 这是因为颜色通道顺序是BBGR,而不是RGB。您可以在代码中添加以下两行:b,g,r = cv2.split(img)img = cv2.merge((b,g,r))
  • 即使我认为您的意图是正确的(拆??分和合并颜色),结果还是一样。你为我做了很多努力。
  • 嘿,注意cv2.merge参数的顺序。在我的评论中,它的状态不佳。尝试用我的答案中的代码。
  • 是的,我在订购颜色时出错。我不知道该如何感谢你。
  • 除了使用cv2.merge,您还可以简单地使用numpy索引来重新排列图像的第三维:out = img[:,:,::-1]。只是一个建议,但是在引用OpenCV文档时,合并是可接受的方式。

 

 


对于Python3,我必须修改@Ha Dang答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from tkinter import *
from PIL import Image, ImageTk
import cv2
import numpy as np

image_name 'bla.jpg'

image = cv2.imread(image_name)

#Rearrang the color channel
b,g,r = cv2.split(image)
img = cv2.merge((r,g,b))

# A root window for displaying objects
root = Tk()  

# Convert the Image object into a TkPhoto object
im = Image.fromarray(img)
imgtk = ImageTk.PhotoImage(image=im)

# Put it in the display window
Label(root, image=imgtk).pack()

root.mainloop(# Start the GUI

要求是:

点3

1
2
3
numpy==1.13.1
opencv-python==3.3.0.9
Pillow==4.2.1

酿造

1
2
python3
tcl-tk
posted @ 2022-06-13 13:24  苍月代表我  阅读(852)  评论(0)    收藏  举报