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

时间:2018-06-15 23:50:15

标签: python list loops python-imaging-library rgb

对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)

所以我的目标是填写清单&#34; dposition&#34;与列表中的所有暗像素的位置&#34;像素&#34;,但我完全不知道如何这样做!到目前为止,列表&#34;黑暗&#34;用于显示红色值<100的所有像素的值。感谢任何帮助,谢谢!

4 个答案:

答案 0 :(得分:0)

将for循环更改为:

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

基本上它的作用是允许我们访问像素红色通道数据和列表中该像素的索引,这样每次我们将某些东西附加到暗像素列表时,我们将它的索引附加到位置列表

答案 1 :(得分:0)

您需要的是在迭代列表时确定索引位置的方法。您可以在列表中创建一个简单的计数器而不是增量:

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)

答案 2 :(得分:0)

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

df2 = df1.groupBy("id").agg(f.concat_ws(",", f.collect_set(df1.con)).alias('Group_con') +---+-----------------------------------------------------------------------------+ | id| Group_con| +---+-----------------------------------------------------------------------------+ | 1|iphone5,iphone,android,android phone,windows,windows pc,spy camera,spy camera| | 2| camera,,apple iphone,iphone| | 3| mac,mac pro,cctv,cctv,,spy camera| +---+-----------------------------------------------------------------------------+

BTW,根据getdata()的文档,它默认返回所有波段。您可能希望使用dposition = [position for position, red in enumerate(pixels) if red < 100]代替红色频段。

答案 3 :(得分:0)

您创建了一个1d数组,因此大多数其他答案将为您提供该1d数组中的位置。如果您需要xy职位,可以采取以下措施:

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

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

im=im.getchannel(0)

转换为2d 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)