Python 不缩放显示图像
给定一个500x500像素的图像,我想在屏幕上以1:1的比例显示该图像。此外,我想有一个x轴和y轴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像素plt.imshow()
在我的屏幕上显示图像1:1,但不添加轴,并在窗口的左下角显示图像。尤其是最大化窗口/调整窗口大小不会改变图像的大小fig.figimage()
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)
帮助:-)谢谢!