将RGB图像转换为灰度并在python中处理像素数据

将RGB图像转换为灰度并在python中处理像素数据,python,image,image-processing,python-imaging-library,Python,Image,Image Processing,Python Imaging Library,我有一个RGB图像,我想把它转换成灰度图像,这样每个像素可以有一个数字(可能在0到1之间)。这给了我一个矩阵,它的尺寸等于图像像素的尺寸。然后我想对这个矩阵做一些操作,并从这个操作后的矩阵生成一个新的灰度图像。我如何才能做到这一点?我经常将图像作为NumPy阵列来处理-我这样做: import numpy as np from PIL import Image x=Image.open('im1.jpg','r') x=x.convert('L') #makes it greyscale y=

我有一个RGB图像,我想把它转换成灰度图像,这样每个像素可以有一个数字(可能在0到1之间)。这给了我一个矩阵,它的尺寸等于图像像素的尺寸。然后我想对这个矩阵做一些操作,并从这个操作后的矩阵生成一个新的灰度图像。我如何才能做到这一点?

我经常将图像作为NumPy阵列来处理-我这样做:

import numpy as np
from PIL import Image

x=Image.open('im1.jpg','r')
x=x.convert('L') #makes it greyscale
y=np.asarray(x.getdata(),dtype=np.float64).reshape((x.size[1],x.size[0]))

<manipulate matrix y...>

y=np.asarray(y,dtype=np.uint8) #if values still in range 0-255! 
w=Image.fromarray(y,mode='L')
w.save('out.jpg')
将numpy导入为np
从PIL导入图像
x=Image.open('im1.jpg','r')
x=x.convert('L')#使其变为灰度
y=np.asarray(x.getdata(),dtype=np.float64)。重新整形((x.size[1],x.size[0]))
y=np.asarray(y,dtype=np.uint8)#如果值仍在0-255范围内!
w=Image.fromarray(y,mode='L')
w、 保存('out.jpg')
如果在操作后数组值y不再在0-255范围内,则可以增加到16位TIFF,或者只需重新缩放


-阿尔多

有努皮和希皮。Scipy允许您加载图像并将其转换为numpy数组。它在后面使用PIL。使用numpy,您可以将RGB“展平”为灰度图像。然后你可以用arrayUse做任何你想做的事-->--或者应该做的事suffice@goncalopp:转换很好,但如何将其转换为2D数组?@lovespeed:使用PIL(la goncalopp的答案)加载图像本质上是一个2D数组。您可以使用
img[x,y]
访问像素。这还不够吗?您可以使用
plt.imshow(y,cmap=plt.get_cmap('gray'))
来显示灰度图像如果您打算继续使用tensorflow(2.x+),您可能会发现tensorflow.keras.preprocessing.image.img_to_array(image)也很有用,因为这会将PIL图像转换为numpy.ndarray