如何使用double for循环创建一个列表,并为critieria分配?

时间:2017-02-24 21:35:50

标签: python opencv numpy

我正在寻找一种pythonic方法来制作一个元组列表,这些元组查看一系列点确定这些点的像素信息是否符合条件,如果是这样,就会添加到列表中。

我有以下代码行,我知道这是不正确的,但我希望它能解释我想要完成的任务。 " h,s,v = img [iy,((x // 2)-ix)]"部分不正确,因为我不认为你不能分配h,s,v我目前如何拥有代码。

如何在for循环中分配h,s,v = img []?

pointlist = [h,s,v = img[iy,((x//2)-ix)] for ix in range(x//2) for iy in ylist if any((hm-hsm)<h<(hm+hsm) and (sm-ssm)<s<(sm+ssm) and (vm-vsm)<v<(vm+vsm) for hm,sm,vm,hsm,ssm,vsm in csample)]

另一种可能写这个的方法是:

csample = (60,30,100,15,15,25)

for iy in ylist:
    for (x//2)-ix for ix in range(x//2):
        h,s,v = img[iy,ix]
        if any((hm-hsm)<h<(hm+hsm) and (sm-ssm)<s<(sm+ssm) and (vm-vsm)<v<(vm+vsm) for hm,sm,vm,hsm,ssm,vsm in csample)

1 个答案:

答案 0 :(得分:2)

您的要求并没有明确说明,但我认为这就是您的想法:

<强>代码:

可能需要解释的一件事是isgood(*img...)。这会扩展tuple中存储的img,并将三个元素作为sperate args传递给is_good。请参阅here

hm, sm, vm, hsm, ssm, vsm = csample
def is_good(h, s, v):
    return (hm-hsm < h < hm+hsm and
            sm-ssm < s < sm+ssm and
            vm-vsm < v < vm+vsm
            )

point_list = [(ix, iy) for iy in ylist for ix in range(x//2+1)
              if is_good(*img[iy, x//2-ix])]

测试数据:

csample = (60, 30, 100, 15, 15, 25)

img = (
    ((1, 2, 3), (1, 2, 3)),
    ((60, 30, 100), (1, 2, 3)),
)
ylist = [0, 1]
x = 2

制作:

[(1, 1)]