我的图片存储为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)
...
答案 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图像。