如何创建具有整数值的 Numpy 数组? (当前版本不适用于 getpixel)

How to create a Numpy array with integer values? (current version doesn't work with getpixel)

我正在使用 PIL 从图片的每个像素获取红色值。但是,我需要所有值都在 numpy 数组中,因为据我所知,这是使用颜色图绘制 3D 图形的唯一方法。 问题是当我尝试使用 getpixel() 查找所需的红色值时,出现以下错误:

Traceback (most recent call last):
  File "C:\Users\Elitebook\Desktop\PIL\Smoke\get_data_smoke.py", line 14, in <module>
    Z=im_rgb.getpixel((X,Y))[0]
  File "C:\Users\Elitebook\AppData\Roaming\Python\Python37\site-packages\PIL\Image.py", line 1436, in getpixel
    return self.im.getpixel(xy)
TypeError: an integer is required

到目前为止,我已经尝试使用 x=x.astype(int)dtype 来获取整数值,但其中 none 有效。

这是我的代码:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d

im=Image.open("smoke.jpg")
im_rgb=im.convert("RGB")

w,h=im.size

x=np.arange(1,w+1,1)
y=np.arange(1,h+1,1)
X,Y=np.meshgrid(x,y)
Z=im_rgb.getpixel((X,Y))[0]

fig=plt.figure()
ax=fig.add_subplot(projection='3d')
ax.plot(X,Y,Z)
plt.show()

你的问题是 getpixel 需要一个整数序列。您的输入 XY 是数组。因此,您需要某种形式的循环来提取各个索引:

x = np.arange(1,w+1,1)
y = np.arange(1,h+1,1)
X,Y = np.meshgrid(x,y)
Z = []
for i,j in zip(X,Y):
      for ii, jj in zip(i,j):
            Z.append(im_rgb.getpixel((int(ii),int(jj))))

如果你想要图像作为 Numpy 数组,只需使用:

na = np.array(im_rgb)

顺便说一下,将 Numpy 数组转回 PIL Image 的逆向操作是:

pilImage = Image.fromarray(na)