使用Matplotlib imshow()显示缩放比例为1的图像(如何操作?)

kxkpmulp  于 2022-11-15  发布在  其他
关注(0)|答案(5)|浏览(198)

我想用Matplotlib.pyplot imshow()函数显示一个图像(比如800x800),但我想显示它,使图像的一个像素在屏幕上占据一个像素(缩放因子= 1,无收缩,无拉伸)。
我是个初学者,你知道怎么做吗?

dly7yett

dly7yett1#

Matplotlib没有为此进行优化。如果你只想以一个像素对一个像素的方式显示图像,那么使用更简单的选项会更好。(例如,看看Tkinter。)
话虽如此说:

import matplotlib.pyplot as plt
import numpy as np

# DPI, here, has _nothing_ to do with your screen's DPI.
dpi = 80.0
xpixels, ypixels = 800, 800

fig = plt.figure(figsize=(ypixels/dpi, xpixels/dpi), dpi=dpi)
fig.figimage(np.random.random((xpixels, ypixels)))
plt.show()

或者,如果你真的想使用imshow,你就需要更详细一点。然而,这有一个好处,允许你在需要的时候放大等等。

import matplotlib.pyplot as plt
import numpy as np

dpi = 80
margin = 0.05 # (5% of the width/height of the figure...)
xpixels, ypixels = 800, 800

# Make a figure big enough to accomodate an axis of xpixels by ypixels
# as well as the ticklabels, etc...
figsize = (1 + margin) * ypixels / dpi, (1 + margin) * xpixels / dpi

fig = plt.figure(figsize=figsize, dpi=dpi)
# Make the axis the right size...
ax = fig.add_axes([margin, margin, 1 - 2*margin, 1 - 2*margin])

ax.imshow(np.random.random((xpixels, ypixels)), interpolation='none')
plt.show()
nhhxz33t

nhhxz33t2#

如果你真的不需要matlibplot,这里是我最好的方法

import PIL.Image
from io import BytesIO
import IPython.display
import numpy as np
def showbytes(a):
    IPython.display.display(IPython.display.Image(data=a))

def showarray(a, fmt='png'):
    a = np.uint8(a)
    f = BytesIO()
    PIL.Image.fromarray(a).save(f, fmt)
    IPython.display.display(IPython.display.Image(data=f.getvalue()))

使用showbytes()显示图像字节字符串,使用showarray()显示数字数组。

ffscu2ro

ffscu2ro3#

如果你在Jupyter笔记本上工作,安装了pillow(Python Imaging Library),并且不需要色彩Map表,那么Image.fromarray就很方便了,你只需要把数据转换成它可以使用的形式(np.uint8bool):

import numpy as np
from PIL import Image
data = np.random.random((512, 512))

Image.fromarray((255 * data).astype(np.uint8))

或者如果您有一个布尔数组:

Image.fromarray(data > 0.5)

1rhkuytd

1rhkuytd4#

这是一个使用imshow的公认答案的修改版本,它对我来说是有效的,至少对正方形图像是有效的(它似乎不总是对非正方形图像有效)。

import matplotlib.pyplot as plt
import numpy as np

image = ...

dpi = 100
margin = 0.05
ypixels, xpixels = image.shape
fig = plt.figure(figsize=((1 + margin * 2) * (xpixels + 1) / dpi,
                          (1 + margin * 2) * (ypixels + 1) / dpi),
                 dpi=dpi)
ax = fig.add_axes([margin, margin,
                   1 / (1 + margin * 2), 1 / (1 + margin * 2)])
ax.imshow(image)
plt.show()

这个答案与公认答案之间的差异是轴的宽度和高度不同,以及每个维度加上1以及margin乘以2的figsize。

jecbmhm3

jecbmhm35#

如果您正在尝试放大图像,则:

import matplotlib.pyplot as plt

import numpy as np

dpi = 80
margin = 0.01 # The smaller it is, the more zoom you have
xpixels, ypixels = your_image.shape[0], your_image.shape[1] ## 

figsize = (1 + margin) * ypixels / dpi, (1 + margin) * xpixels / dpi

fig = plt.figure(figsize=figsize, dpi=dpi)
ax = fig.add_axes([margin, margin, 1 - 2*margin, 1 - 2*margin])

ax.imshow(your_image)
plt.show()

相关问题