Python 不缩放显示图像

Python 不缩放显示图像,python,matplotlib,Python,Matplotlib,给定一个500x500像素的图像,我想在屏幕上以1:1的比例显示该图像。此外,我想有一个x轴和y轴 plt.imshow()会自动将轴添加到我的图像中,并在窗口中居中显示图像,但图像会缩放,不会在我的屏幕上显示为500x500像素 fig.figimage()在我的屏幕上显示图像1:1,但不添加轴,并在窗口的左下角显示图像。尤其是最大化窗口/调整窗口大小不会改变图像的大小 现在,我需要的是两者的结合–像图1:1一样显示图像。图2添加plt.imshow()添加的轴,并像plt.imshow(

给定一个500x500像素的图像,我想在屏幕上以1:1的比例显示该图像。此外,我想有一个x轴和y轴

  • plt.imshow()
    会自动将轴添加到我的图像中,并在窗口中居中显示图像,但图像会缩放,不会在我的屏幕上显示为500x500像素
  • fig.figimage()
    在我的屏幕上显示图像1:1,但不添加轴,并在窗口的左下角显示图像。尤其是最大化窗口/调整窗口大小不会改变图像的大小
现在,我需要的是两者的结合–像图1:1一样显示图像。图2添加
plt.imshow()
添加的轴,并像
plt.imshow()那样居中显示图像

我该怎么做? 或者换句话说:如何告诉
plt.imshow()
figimage()一样显示未缩放的im图像

演示问题的示例代码:

import matplotlib.pyplot as plt
import numpy as np

width=500;
height=500;

# using plt.imshow()
dummyImage = np.zeros((width, height))
plt.imshow(dummyImage)
plt.show()

# using fig.figimage()
fig = plt.figure(figsize=(width, height))
fig.figimage(dummyImage)
plt.show()
结果:

使用
plt.imshow()
:不完全是500x500像素,实际大小取决于窗口的大小。

使用
图figimage()
:精确为500x500像素,与窗口大小无关


您需要自己做一点计算。 比如说,你想要在所有边上都有50个像素的边距,并且dpi为100,那么你可以计算图形大小为
figsize=((宽度+2*边距)/dpi,(高度+2*边距)/dpi)
inches。然后,您需要计算边框,例如,左边框将是边距除以dpi除以地物宽度。您可以将计算出的地物大小(
plt.figure()
)和边框(使用
子地块调整
)设置为您的地物

import matplotlib.pyplot as plt
import numpy as np

width=500 # pixels
height=150
margin=50 # pixels
dpi=100. # dots per inch

figsize=((width+2*margin)/dpi, (height+2*margin)/dpi) # inches
left = margin/dpi/figsize[0] #axes ratio
bottom = margin/dpi/figsize[1]

fig = plt.figure(figsize=figsize, dpi=dpi)
fig.subplots_adjust(left=left, bottom=bottom, right=1.-left, top=1.-bottom)

dummyImage = np.zeros((height, width))
plt.imshow(dummyImage)
plt.show()

请注意,要获得尺寸宽度
width
和高度
height
的图像,您需要一个数组
np.zero((高度,宽度))
,而不是相反的数组

为了确保地物保持其原始大小,可以添加以下代码,每次尝试更改地物大小时,都会将地物大小调整回原始大小:

def update(event=None):
    fig.set_size_inches(figsize)

update()
ci = fig.canvas.mpl_connect("resize_event", update)
plt.show()

尝试将其转换为PNG,然后使用
IPython.display.Image
显示它。除此之外,我不知道如何使它不可缩放。谢谢,但我想直接显示它,如果可能的话,使用matplotlib。谢谢您的详细回复!这已经很接近了,但是widht似乎是500,包括TIK(y轴上的标记)。我需要500只为形象本身。你知道如何确保图形在最大化窗口时不调整大小吗?宽度应该是没有刻度的宽度。使用
savefig
导出图形时,可以看出这是正确的。现在似乎确实存在一个问题,即窗口可能会在创建时调整图形的大小。这里似乎就是这样,使用QtAgg后端。使用TkAgg后端不会发生这种情况。您愿意使用Tk吗?我添加了
import matplotlib matplotlib.use('TkAgg')
,但是图像距离500像素远。你知道这是什么原因吗?我尝试了你的代码添加,以保持数字的原始大小。当使用TkAgg时,其大小与打开窗口时相同,但图像大小仍大于500 px。尝试更改dpi变量,但即使将其设置为200,也不会改变任何内容-我的图像宽度约为750 px,而不是500 px。我在一个4k显示器上,轴很大,有点磨损。似乎TkAgg在高DPI方面有问题。更新:更改DPI只会影响轴,而不会影响图像大小本身(图像大小保持在大约750像素而不是500像素),我找到了原因:Windows DPI缩放设置为150%。将figsize行更改为
figsize=((宽度/1.5+2*边距)/dpi,(高度/1.5+2*边距)/dpi)
帮助:-)谢谢!