python - 图像的RGB矩阵

Oja*_*jas 20 python numpy image python-imaging-library

将图像作为输入,如何获得与其对应的rgb矩阵?我检查了numpy.asarray函数.这会给我rgb矩阵或其他矩阵吗?

aba*_*ert 15

请注意,此答案已于2018年过时; scipy已弃用imread,您应切换到imageio.imread.请参阅此转换文档,了解两者之间的差异.如果您只是导入新库代替旧库,下面的代码应该没有任何更改,但我还没有测试过.


最简单的答案是在PIL周围使用NumPy和SciPy包装器.有一个很棒的教程,但基本的想法是:

from scipy import misc
arr = misc.imread('lena.png') # 640x480x3 array
arr[20, 30] # 3-vector for a pixel
arr[20, 30, 1] # green value for a pixel
Run Code Online (Sandbox Code Playgroud)

对于640x480 RGB图像,这将为您提供640x480x3阵列uint8.

或者你可以用PIL打开文件(或者更确切地说,Pillow;如果你还在使用PIL,这可能不起作用,或者可能非常慢)并直接传递给NumPy:

import numpy as np
from PIL import Image
img = Image.open('lena.png')
arr = np.array(img) # 640x480x4 array
arr[20, 30] # 4-vector, just like above
Run Code Online (Sandbox Code Playgroud)

这将为您提供640x480x4类型的数组uint8(第4个是alpha; PIL总是将PNG文件作为RGBA加载,即使它们没有透明度;看看img.getbands()你是否都不确定).

如果您根本不想使用NumPy,PIL自己的PixelArray类型是一个更有限的数组:

arr = img.load()
arr[20, 30] # tuple of 4 ints
Run Code Online (Sandbox Code Playgroud)

这为您提供了一个640x480 PixelAccess的RGBA 4元组阵列.

或者你可以打电话getpixel给图像:

img.getpixel(20, 30) # tuple of 4 ints
Run Code Online (Sandbox Code Playgroud)

  • 更新:`imread`在SciPy 1.0.0中已弃用,在1.2.0中将被删除。使用`imageio.imread`代替。[源代码](https://docs.scipy.org/doc/scipy/reference/generated/scipy.misc.imread.html) (2认同)

Bem*_*mmu 12

我有一种感觉,我没有完全按照你的意愿行事,所以请指明这是否完全不合适.您可以像这样打开图像并获取像素数组:

import Image
im = Image.open('Lenna.png')
pixels = list(im.getdata())
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个看起来像的RGB数据的平面列表

[(226, 137, 125), (226, 137, 125), (223, 137, 133), (223, 136, 128), 
 (226, 138, 120), (226, 129, 116), (228, 138, 123), (227, 134, 124), 
 (227, 140, 127), (225, 136, 119), (228, 135, 126), (225, 134, 121),...
Run Code Online (Sandbox Code Playgroud)

现在这将是一个平面数组中的所有像素,如果你想要一个二维数组,那么就需要一些额外的代码.不确定PIL中是否有直接功能.


小智 6

您可以使用 来做到这一点Pillow,该getdata方法为您提供一个平面像素数组,然后您可以使用size图像的 来构建一个矩阵。

from PIL import Image

def getPixels(filename):
    img = Image.open(filename, 'r')
    w, h = img.size
    pix = list(img.getdata())
    return [pix[n:n+w] for n in range(0, w*h, w)]
Run Code Online (Sandbox Code Playgroud)


Den*_*loe 5

我试过了imageio.imread,效果很好,但一分钟后偶然发现了一个功能matplotlib完全相同的函数,得到一个numpyn x m x 3 数组:

from matplotlib import pyplot as plt
image = plt.imread(path)
Run Code Online (Sandbox Code Playgroud)