垂直迭代图像以获取其像素索引



我正在尝试迭代图像中的像素,但不是垂直而不是正常的水平方式。以下是我可能拥有的小尺寸图像的示例(我有数百大小的图像):

"""
Note: X represents pixels
Sample Image (3 x 4):
X X X X
X X X X
X X X X
"""

显然,要水平迭代此图像,很容易做到,就像我在这里所做的那样:

import itertools
width = range(3)
height = range(4)
print("Pixel positions:")
for pixel in itertools.product(width, height):
print(*pixel)

输出:

Pixel positions:
0 0
0 1
0 2
0 3
1 0
1 1
1 2
1 3
2 0
2 1
2 2
2 3

这些是图像中像素的索引位置(假设它是大型 2D 像素列表),但水平迭代。我希望能够做同样的事情,但垂直。是否有一个迭代工具函数允许我做同样的事情,但按列?下面是此示例图像的索引:

Column-wise:
0 0
1 0
2 0
0 1
1 1
2 1
0 2
1 2
2 2
0 3
1 3
2 3

我试图用print(*pixel[::-1])反转仓位,但是,这会导致某些指数仓位超出范围,例如最后一个从2 33 23 2无效,因为没有 3 行(仅限 0、1、2)。其他职位也是如此。

我想要一个不使用非内置库的解决方案。Itertools很好,因为我正在将它用于程序中的其他内容。

试试这段代码:

width = range(3)
height = range(4)
print("Pixel positions:")
for x in height:
for y in width:
print(y, x)

输出:

Pixel positions:
0 0
1 0
2 0
0 1
1 1
2 1
0 2
1 2
2 2
0 3
1 3
2 3

要水平迭代,只需交换两个 for 循环:

width = range(3)
height = range(4)
print("Pixel positions:")
for y in width:
for x in height:
print(y, x)

性能比较:

$ python -m timeit -n 100 '
width = range(1000)
height = range(1000)
for pixel in ((x, y) for y in height for x in width):
pass
'
100 loops, best of 3: 104 msec per loop

嵌套 for 循环的速度提高了大约 8 倍

$ python -m timeit -n 100 '
width = range(1000)
height = range(1000)
for y in width:
for x in height:
pass
'
100 loops, best of 3: 12.7 msec per loop

当还创建包含结果坐标的元组时,代码仍然快2 倍。但是,手头的任务是否需要创建包含坐标的元组是值得怀疑的。

$ python -m timeit -n 100 '
width = range(1000)
height = range(1000)
for y in width:
for x in height:
(x, y)
'
100 loops, best of 3: 52.5 msec per loop

根据文档,itertools.product(width, height)等于:

((x, y) for x in width for y in height)

如果要按列迭代,只需交换内部循环:

for pixel in ((x, y) for y in height for x in width):
print(*pixel)
0 0
1 0
2 0
0 1
1 1
2 1
0 2
1 2
2 2
0 3
1 3
2 3

最新更新