逐像素读取图像(ndimage / ndarray)

时间:2015-01-27 16:19:22

标签: python numpy scipy multidimensional-array ndimage

我的图片存储为ndarray。我想迭代这个数组中的每个像素。

我可以迭代遍历数组的每个元素:

from scipy import ndimage
import numpy as np

l = ndimage.imread('sample.gif', mode="RGB")

for x in np.nditer(l):
    print x

这给出了ie:

...
153
253
153
222
253
111
...

这些是像素中每种颜色的值,一个接一个。我想要的是将这些值3乘3读出来产生这样的东西:

...
(153, 253, 153)
(222, 253, 111)
...

3 个答案:

答案 0 :(得分:3)

最简单的方法可能是首先重塑numpy数组,然后再进行打印。

http://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

此外,这应该对你有所帮助。 Reshaping a numpy array in python

答案 1 :(得分:3)

您可以尝试用自己的方式压缩列表:

from itertools import izip
for x in izip(l[0::3],l[1::3],l[2::3]):
    print x

输出:

(153, 253, 153)
(222, 253, 111)

更新: Welp,我在2015年的numpy表现糟糕。以下是我的最新回答:

scipy.ndimage.imread现已弃用,建议使用imageio.imread。然而,出于这个问题的目的,我测试了它们并且它们的行为相同。

由于我们正在以RGB的形式阅读图片,因此我们将获得一个heightxwidthx3数组,这已经是您想要的了。使用np.nditer迭代数组时,您将失去形状。

>>> img = imageio.imread('sample.jpg')
>>> img.shape
(456, 400, 3)
>>> for r in img:
...     for s in r:
...         print(s)
... 
[63 46 52]
[63 44 50]
[64 43 50]
[63 42 47]
...

答案 2 :(得分:1)

虽然@Imran的答案有效,但它不是一个直观的解决方案......这可能会使调试变得困难。就个人而言,我避免对图像进行任何操作,然后使用for循环进行处理。

备选方案1:

img = ndimage.imread('sample.gif')
rows, cols, depth = np.shape(img)

r_arr, c_arr = np.mgrid[0:rows, 0:cols]

for r, c in zip(r_arr.flatten(), c_arr.flatten()):
    print(img[r,c])

或者您可以使用嵌套for循环直接执行此操作:

for row in img:
    for pixel in row:
        print(pixel)

请注意,这些是灵活的;无论深度如何,它们都适用于任何2D图像。