繁体   English   中英

python - 图像的RGB矩阵

[英]python - RGB matrix of an image

以图像作为输入,如何得到与之对应的rgb矩阵? 我检查了 numpy.asarray 函数。 这是否给了我 rgb 矩阵或其他一些矩阵?

请注意,此答案截至 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

对于 640x480 RGB 图像,这将为您提供uint8的 640x480x3 数组。

或者,您可以使用 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

这将为您提供uint8类型的 640x480x4 数组(第 4 个是 alpha;PIL 始终将 PNG 文件加载为 RGBA,即使它们没有透明度;如果您不确定,请参阅img.getbands() )。

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

arr = img.load()
arr[20, 30] # tuple of 4 ints

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

或者你可以在图像上调用getpixel

img.getpixel(20, 30) # tuple of 4 ints

我有一种感觉,我在这里没有完全按照您的意愿行事,因此请说明这是否完全关闭。 你可以像这样打开图像并获得一个像素数组:

import Image
im = Image.open('Lenna.png')
pixels = list(im.getdata())

这将为您提供一个平面的 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),...

现在这将是平面阵列中的所有像素,如果您想要二维阵列,则需要一些额外的代码。 不确定 PIL 中是否有直接的函数。

我尝试了imageio.imread并且它工作得很好,但一分钟后偶然发现了matplotlib中的一个函数,它的工作imageio.imread完全相同,得到了一个numpy n × m × 3 数组:

from matplotlib import pyplot as plt
image = plt.imread(path)

另外要补充的是,如果您或其他任何人正在使用 opencv。

 imgc=cv2.imread(file)

或读入灰度

 imgc=cv2.imread(file,0)

如果您将在图像之间进行一些比较,您可能需要考虑将像素阵列转换为直方图以对数据进行标准化。

   hist = np.histogram(img.flatten(),256,[0,256])[0]

上面的行首先展平了您的 img 数组,因此您确实会丢失图像的维度。 然后它生成从 0 到 256(对于灰度图像)的 bin,并将来自 img 的计数添加到这些 bin 并将它们作为 hist 返回,然后可以绘制。 例如,如果 100 bin 的值为 20,则表示图像中 20 个像素的值为 100。

希望这为任何希望开始使用 opencv 的人增加了另一种思考的可能性。

您可以使用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)]

谢谢abarenet! 请使用imageio而不是scipy因为scipy不再继续。 简化abarnet的答案:

  1. 安装imageio

    pip3 install imageto

  2. python3代码:

    如果图像的尺寸为260X340 ,则rgb_matrix是尺寸为260X340X3的数组

    from imageio import imread rgb_matrix = imread('image13.png') print(rgb_matrix[15][23])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM