【发布时间】:2022-01-01 13:01:39
【问题描述】:
我正在尝试从 tkinter 中的光子探测器和皮拉图斯探测器系统打开一个 32 位灰度图像。 tkinter 画布中显示的图像是黑色的。我找不到任何可行的建议。感谢您对以下代码的任何帮助。 谢谢 [皮拉图斯图片][1]
from skimage import io, img_as_float, util, morphology
from skimage.util import img_as_ubyte
from tkinter import *
from PIL import Image, ImageTk
from tkinter import Tk, Button, Canvas, Frame, Label, filedialog
img_data= img_as_float(io.imread("slice0040.tif"))
Width, Height=img_data.shape
#convert img_data to 8 bit using skimage
#and making an image for display using tkinter
img=Image.fromarray(util.img_as_ubyte(img_data))
root=Tk()
frame=LabelFrame(root,text='Image frame',width=Width,height=Height)
frame.grid(row=1,column=0,rowspan=2)
canvas = Canvas(frame, width=Width, height=Height)
canvas.grid(row=0, column=0,sticky=W)
img = ImageTk.PhotoImage(img.resize((Width, Height), Image.ANTIALIAS))
img_container = canvas.create_image(Width-int(Width/2), int(Height)-int(Height/2), image=img)
root.mainloop()
这个适用于 int 类型和 float 类型的图像。
import cv2
import numpy as np
from tkinter import *
from PIL import Image, ImageTk
# Load with PIL
im = Image.open('Pilatus.tif')
# Make into Numpy array and normalise
na = np.array(im)
if im.mode =='F' :
norm = cv2.normalize(na, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)
else:
norm = na
img=(norm*255).astype(np.uint8)
root=Tk()
Width=1000
Height=1000
label=Label(root,text="Root label",font=("Verdana",12))
label.grid(row=0,column=0)
frame=LabelFrame(root,text='Image frame',width=Width,height=Height)
frame.grid(row=1,column=0,rowspan=2)
print(Width,Height)
label=Label(frame,text="Image frame")
label.grid(row=2,column=0,columnspan=2)
canvas = Canvas(frame, width=Width, height=Height)
canvas.grid(row=3, column=0,sticky=W)
img=Image.fromarray(img)
img = ImageTk.PhotoImage(img.resize((Width, Height), Image.ANTIALIAS))
img_container = canvas.create_image(Width-int(Width/2), int(Height)-int(Height/2), image=img)
root.mainloop()
【问题讨论】:
-
如果是TIFF图片,为什么不直接使用
PIL.Image来加载图片呢? -
我不熟悉您使用的特定库,但通常浮点格式的图像具有 0.0 到 1.0 范围内的像素值。如果你盲目地将其转换为 8 位整数,你只会得到 0 或 1 的像素值 - 换句话说,“黑色”和“非常接近黑色,你无法区分”。
-
@acw1668,这是一个 32 位输入图像,PIL 不支持加载 32 个图像。如果我错了,请纠正我。我是新手。谢谢。
-
基于图像modes上的文档,PIL支持32位图像。您可以简单地尝试使用 PIL 加载图像并查看它是否有效。
-
@acw1668,对不起,我之前不清楚。我们可以使用 PIL 加载 32 位图像,但 tkinter 不支持 32 位图像。在画布上显示它们之前,它们需要转换为 8 位或 16 位类型。我想使用 skimage 进行图像处理,这就是我使用 skimage 加载图像的原因。
标签: tkinter python-imaging-library scikit-image 32-bit