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



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

Traceback (most recent call last):
File "C:UsersElitebookDesktopPILSmokeget_data_smoke.py", line 14, in <module>
Z=im_rgb.getpixel((X,Y))[0]
File "C:UsersElitebookAppDataRoamingPythonPython37site-packagesPILImage.py", line 1436, in getpixel
return self.im.getpixel(xy)
TypeError: an integer is required

到目前为止,我已经尝试过使用x=x.astype(int)dtype来获取整数值,但都不起作用。

这是我的代码:

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()

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

na = np.array(im_rgb)

顺便说一句,将Numpy数组变回PIL Image的相反操作是:

pilImage = Image.fromarray(na)

您的问题是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))))

最新更新