matplotlib绘制小图像,无需重新采样

时间:2012-03-28 15:05:24

标签: python matplotlib

我正在尝试使用matplotlib在python中绘制一个小图像,并希望显示的轴具有与它生成的numpy数组相同的形状,即数据不应重新采样。换句话说,数组中的每个条目应对应于屏幕上的像素(或其左侧)。这看起来微不足道,但即使在网上拖网一段时间之后,我似乎无法让它发挥作用:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

X = np.random.rand(30,40)

fig = plt.figure()
fig.add_axes(aspect="equal",extent=[0, X.shape[1], 0, X.shape[0]])
ax = fig.gca()
ax.autoscale_view(True, False, False)
ax.imshow(X, cmap = cm.gray)

plt.show()

4 个答案:

答案 0 :(得分:5)

我自己也遇到过同样的问题。如果interpolation='nearest'的{​​{1}}选项不够好,那么如果您的主要目标是在matplotlib中查看原始的,未缩放的,非插值的,未扫描的像素,那么您可以'哇imshow恕我直言。演示:

figimage

当然这意味着放弃轴(或以某种方式自己绘制)。 import numpy as np import numpy.random import matplotlib.pyplot as plt a=256*np.random.rand(64,64) f0=plt.figure() plt.imshow(a,cmap=plt.gray()) plt.suptitle("imshow") f1=plt.figure() plt.figimage(a,cmap=plt.gray()) plt.suptitle("figimage") plt.show() 有一些选项让你可以围绕图形移动图像,所以我想可以在其他方法创建的某些轴上操纵它们。

答案 1 :(得分:3)

您可以使用以下代码段将数组转换为PIL(Python Imaging Library)。生成的图像将具有与输入数组相同的大小。它可以显示或保存为图像。

from PIL import Image
from numpy import linspace, array, fromfunction, sin, cos
from matplotlib import cm


# scale array between vmin and vmax and encode it to uint8 (256 values)
def scale(arr, vmin, vmax):
    return (255*(arr - vmin)/(vmax - vmin)).clip(0, 255).astype('uint8')

# convert a matplotlib colormap into a PIL palette
def getpalette(cmap):
    return (255.*array(map(lambda x: cmap(x)[0:3], linspace(0., 1.,256))).ravel()).astype('int')


# a sample array
data = fromfunction(lambda i,j: cos((i+j)/50)*sin(i/50.), (200, 300), dtype='float')

# convert the float array to a PIL image
im = Image.fromarray(scale(data, 0, 1))
im.putpalette(getpalette(cm.jet))
im.save('test.png') # or im.show()

唯一的问题是im.show()不是很好,因为它需要拥有图像查看器xv并且它会写一个临时图像。所以你也可以写一个文件并用你最喜欢的图像浏览器加载它。

答案 2 :(得分:1)

我不确定我完全理解你的问题。这是否意味着您希望x轴介于0和X.shape [1]之间,y轴介于0和X.shape [0]之间?在这种情况下,此代码应该可以解决这个问题:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

X = np.random.rand(30,40)

fig = plt.figure()

plt.xlim(0, X.shape[1])
plt.ylim(0, X.shape[0])

ax = fig.gca()
ax.autoscale_view(True, False, False)
ax.imshow(X, cmap = cm.gray)

plt.show()

希望有所帮助

答案 3 :(得分:1)

如果您知道图像的原始分辨率,则可以在plt.figure(dpi=value)中将dpi参数设置为您想要的值。

您可以在此link上找到有关调整图像大小的更多信息。