[英]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的答案:
安装imageio
pip3 install imageto
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.