在遍历列表时无法获取元素的位置 (Python)

Trouble getting the position of an element while looping through a list (Python)

对 python 很陌生,所以这可能很简单。

我正在使用 PIL,我已经使用 Image.getdata() 生成了像素信息列表。我的目标是找到图像红色通道中的所有暗像素,并创建一个列表,列出它们在整个像素列表中出现的位置。这是我的。

import PIL
from PIL import Image
import os

os.chdir('Correct Path')

im=Image.open('TRY.jpg')
im=im.getchannel(0)
pixels = list(im.getdata())

dark = []
dposition = []
for a in pixels:
    if a<100:
        dark.append(a)

print(dark)

所以我的目标是用列表 "pixels" 中所有暗像素的位置填充列表 "dposition",但我完全不知道该怎么做!到目前为止,列表 "dark" 用于显示红色值 <100 的所有像素的值。感谢您的帮助,谢谢!

将您的 for 循环更改为:

for a in range(0,len(pixels)):
    if pixels[a]<100:
        dark.append(pixels[a])
        dposition.append(a)

基本上这样做是允许我们访问像素红色通道数据和列表中该像素的索引,这样每次我们将某些内容附加到暗像素列表时,我们将它的索引附加到安置名单。

您需要的是一种在遍历列表时确定索引位置的方法。您可以创建一个简单的计数器,而不是在遍历列表时递增:

dark = []
dposition = []
count = 0
for a in pixels:
    if a<100:
        dark.append(a)
        dposition.append(count)
    count += 1

或者您可以使用 Python 的内置 enumerate 函数在迭代时生成位置:

dark = []
dposition = []
for position, a in enumerate(pixels):
    if a<100:
        dark.append(a)
        dposition.append(position)

如果您只对暗像素的位置感兴趣,enumerate() + list comprehension 给您一个单行:

dposition = [position for position, red in enumerate(pixels) if red < 100]

顺便说一句,根据 getdata() 的文档,它默认 returns 所有波段。您可能想使用 getdata(band=0) 代替红色带。

您创建了一个一维数组,因此大多数其他答案都会为您提供该一维数组中的位置。如果您需要 xy 位置,可以这样做:

import PIL
from PIL import Image
import os
import numpy as np

im=Image.open('cat.jpg')

im=im.getchannel(0)

转换为二维 numpy 数组。

im = np.asarray(im)
dposition = []
for i, row in enumerate(im):
    for j, pixel in enumerate(row):
        if pixel < 100:
            dposition.append((i, j))

print(dposition)