将RGB图像转换为灰度图像并在Python中操作像素数据

12

我有一张RGB图像,想将其转换为灰度图像,以便每个像素可以有一个数字(可能在0到1之间)。这会给我一个矩阵,其尺寸等于图像的像素尺寸。然后我想对此矩阵进行一些操作,并从这个操作过的矩阵生成一张新的灰度图像。我该怎么做?


有numpy和scipy。Scipy可以让你加载图像并将其转换为numpy数组。它使用PIL作为后端。使用numpy,您可以将RGB“平坦化”为灰度图像。然后,您可以对该数组进行任何操作。 - Pierre Turpin
使用 --> openCV 或者 SimpleCV - user3570335
这个答案应该足够了:https://dev59.com/EWct5IYBdhLWcg3wSbnY#12201744 - loopbackbee
@goncalopp:转换没问题,但我怎么将它转换为二维数组? - lovespeed
@lovespeed:使用PIL加载图像(类似于goncalopp的答案)本质上是一个二维数组。您可以使用img[x,y]访问像素。这不足够吗? - rayryeng
1个回答

17

我经常使用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')

如果您的数组值y在操作后不再在0-255范围内,您可以升级到16位TIFF或简单地重新调整比例。

-Aldo


你可以使用plt.imshow(y, cmap=plt.get_cmap('gray'))来显示灰度图像。 - KY Lu
如果您计划继续使用tensorflow(2.x+)进行工作,那么您可能会发现tensorflow.keras.preprocessing.image.img_to_array(image)也很有用,因为它可以将PIL图像转换为numpy.ndarray。 - jtromans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接