Python t带缩放功能的16位原始(单色)图像显示器?

Python t带缩放功能的16位原始(单色)图像显示器?,python,numpy,tkinter,python-imaging-library,Python,Numpy,Tkinter,Python Imaging Library,我有一个numpy数组形式的16位图像(但只有10位有效)。我当前用于显示图像的代码是: from Tkinter import * import Image, ImageTk from functools import * import numpy as np class ImExam(): def __init__(self): self.imExamDisp = Toplevel() Label(self.imExamDisp, text="

我有一个numpy数组形式的16位图像(但只有10位有效)。我当前用于显示图像的代码是:

from Tkinter import *
import Image, ImageTk

from functools import *

import numpy as np

class ImExam():
    def __init__(self):
        self.imExamDisp = Toplevel()

        Label(self.imExamDisp, text="Pixel").grid(row=0, column=0)
        self.pixelCoord = Label(self.imExamDisp); self.pixelCoord.grid(row=0, column=1)
        Label(self.imExamDisp, text="Value").grid(row=0, column=2)
        self.pixelValue = Label(self.imExamDisp); self.pixelValue.grid(row=0, column=3)
        self.imgDisp = Label(self.imExamDisp, borderwidth=0)
        self.imgDisp.grid(row=1, column=0, columnspan=4)

    def updateImage(self, img, dispIMin=None, dispIMax=None):
        self.i = Image.fromarray(img, mode='I;16')
        self.iTk = ImageTk.PhotoImage('I;16', img.shape)
        self.iTk.paste(self.i)

        self.imgDisp.bind('<Motion>', partial(self.getPixelValue, img=self.i))
        self.imgDisp.configure(image=self.iTk)
        self.imgDisp.grid(row=1, column=0, columnspan=4)

        self.imExamDisp.update()

    def getPixelValue(self, event, img):
            x = event.x
            y = event.y
            value = img.getpixel((x, y))
            self.pixelCoord.configure(text="%02s, %02s" % (x, y))
            self.pixelValue.configure(text="%0.4g" % value)
在这个问题之后,我可以改变显示比例吗?e、 g.不显示0-1023的值,我可以显示100-800的图像吗

Tkinter可能不是解决这个问题的方法,所以我对其他软件包持开放态度。也许用numpy或其他方法来缩放图像(例如,在100-800之间)更好。这也是可以接受的。任何建议,谢谢

我似乎无法通过PIL文档、其他帖子等找到解决方案

编辑

好的,我部分回答了我自己的问题;我不确定这是不是一个可以做这件事的地方,但它可能会有所帮助。我给了
matplotlib
一个镜头,取而代之的是下面的代码(接口为w/
Tkinter
,如下示例):

从Tkinter导入*
导入matplotlib
从matplotlib.backends.backend_tkagg导入图CAVASTKAGG,导航工具栏2TKAGG
从matplotlib.figure导入图形
从functools导入*
将numpy作为np导入
类ImExam():
定义初始化(自):
self.font=(“Helvetica”,9)
self.imExamDisp=Toplevel()
标签(self.imExamDisp,text=“Pixel”).grid(行=0,列=0)
self.pixelCoord=标签(self.imExamDisp);self.pixelCoord.grid(行=0,列=1)
标签(self.imExamDisp,text=“Value”).grid(行=0,列=2)
self.pixelValue=标签(self.imExamDisp);self.pixelValue.grid(行=0,列=3)
matplotlib.rcParams.update({'font.family':'Helvetica','font.size':9})
#
###设置图像窗口
#
self.fig=图(frameon=False)
self.subPlot=self.fig.add_轴([0,0,1,1],frameon=False);#添加填充图中图像所需的_轴
self.subPlot.set_axis_off()
self.imgDisp=FigureCanvasTkAgg(self.fig,master=self.imExamDisp)
self.imgDisp.show();self.imgDisp.get_tk_widget().grid(行=0,列=0,粘性=N+E+S+W)
def updateImage(self、img、dispIMin=0、dispIMax=1023、virtFlag=0):
self.subPlot.imshow(img,vmin=dispIMin,vmax=dispIMax,interpolation=“quadrac”,aspect='auto',cmap='gray')
self.imgDisp.draw()
self.imgDisp.get_tk_widget().bind(“”,部分(self.getPixelValue,img=img))
self.imgDisp.get_tk_widget().grid(行=1,列=0,列span=4)
self.imExamDisp.update()
def getPixelValue(自身、事件、img):
x=事件.x
y=事件。y
value=img[y,x]#imshow(或其他)开关x,y
self.pixelCoord.configure(text=“%02s,%02s”%(x,y))
self.pixelValue.configure(text=“%0.4g”%value)
img
仍然是一个numpy数组,具有
img.dtype=uint16
。不幸的是,光标看不到图像右侧约6个像素的边框和底部约1个像素的边框(从0-489和0-649开始;应该是0-490和0-655)。我不知道这是框架问题还是其他问题。图像周围仍然有一个讨厌的黑色边框,我认为
frameon=False
可以去掉,但可能不会……如果我弄明白了,我会对此发表评论。如果您遇到此问题,请告诉我。谢谢

print np.min(img), np.max(img), img.shape, img.dtype
109 1023 (491, 656) uint16
from Tkinter import *

import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure

from functools import *

import numpy as np

class ImExam():
    def __init__(self):
        self.font = ("Helvetica", 9)
        self.imExamDisp = Toplevel()

        Label(self.imExamDisp, text="Pixel").grid(row=0, column=0)
        self.pixelCoord = Label(self.imExamDisp); self.pixelCoord.grid(row=0, column=1)
        Label(self.imExamDisp, text="Value").grid(row=0, column=2)
        self.pixelValue = Label(self.imExamDisp); self.pixelValue.grid(row=0, column=3)

        matplotlib.rcParams.update({'font.family': "Helvetica", 'font.size': 9})

        #
        ### Setup image window
        #
        self.fig  = Figure(frameon=False)
        self.subPlot = self.fig.add_axes([0, 0, 1, 1], frameon=False);     # add_axes needed to fill image in Figure
        self.subPlot.set_axis_off()

        self.imgDisp = FigureCanvasTkAgg(self.fig, master=self.imExamDisp)
        self.imgDisp.show(); self.imgDisp.get_tk_widget().grid(row=0, column=0, sticky=N+E+S+W)

    def updateImage(self, img, dispIMin=0., dispIMax=1023., virtFlag=0):
        self.subPlot.imshow(img, vmin=dispIMin, vmax=dispIMax, interpolation="quadric", aspect='auto', cmap='gray')
        self.imgDisp.draw()

        self.imgDisp.get_tk_widget().bind('<Motion>', partial(self.getPixelValue, img=img))
        self.imgDisp.get_tk_widget().grid(row=1, column=0, columnspan=4)

        self.imExamDisp.update()

    def getPixelValue(self, event, img):
        x = event.x
        y = event.y
        value = img[y, x]     # imshow (or something) switches x, y
        self.pixelCoord.configure(text="%02s, %02s" % (x, y))
        self.pixelValue.configure(text="%0.4g" % value)