基本Python:将字符串作为输入传递给函数

时间:2016-10-01 16:59:56

标签: python string for-loop

我刚刚开始使用python。我有4个变量F_1,F_2,F_3和F_4。每个都包含一个矩阵。我想计算每个值中的非零值。所以我写了一个循环。

f_1 = thresh1[1:mr, 1:mc]
f_2 = thresh1[1:mr, (mc+1):width]
f_3  = thresh1[(mr+1):height, 1:mc]
f_4 = thresh1[(mr+1):height, (mc+1):width]

b_1 = thresh2[1:mr, 1:mc]
b_2 = thresh2[1:mr, (mc+1):width]
b_3  = thresh2[(mr+1):height, 1:mc]
b_4 = thresh2[(mr+1):height, (mc+1):width]

for i in range(1, 5):
    n1 = "f_"
    n2 = "b_"
    num = str(i)
    n1 += num
    n2 += num

    r = cv2.countNonZero((n1)/cv2.countNonZero(n2))
    print r

我想将连接的字符串n1n2作为输入传递给等式cv2.countNonZero((n1)/cv2.countNonZero(n2))

这里F1是二进制图像(F与前景一样),B1也是二进制图像(B与背景中一样)。我试图计算前景与背景中非零像素的比例。

r应计算F1 / B1,并在下一次迭代F2 / B2 ......等等

2 个答案:

答案 0 :(得分:1)

您遇到的问题是您尝试使用字符串来引用变量名称。这很难做到;你最好使用列表来包含你的图像。也就是说,不要尝试引用f_1f_2等,而是创建一个名为f的列表,其中包含每个图像。

例如,使用:

代替顶部的代码
f = [
  thresh1[1:mr, 1:mc],
  thresh1[1:mr, (mc+1):width],
  thresh1[(mr+1):height, 1:mc],
  thresh1[(mr+1):height, (mc+1):width]
]

b = [
  thresh2[1:mr, 1:mc],
  thresh2[1:mr, (mc+1):width],
  thresh2[(mr+1):height, 1:mc],
  thresh2[(mr+1):height, (mc+1):width]
]

现在,您可以使用代码f_1引用您之前调用的内容f[1]

现在,在你的循环中,你可以使用:

for i in range(1, 5):
    r = cv2.countNonZero(f[i])/cv2.countNonZero(b[i])
    print r

我建议您研究如何在Python中使用列表,因为这是一个基本的数据结构。此外,"f_1"(字符串)和f_1(名为f_1的变量)之间存在差异。你不能(轻松)介于两者之间。

答案 1 :(得分:1)

f_1_nz = f_1[f_1 != 0].size
# etc.

r_1 = f_1_nz / b_1_nz
# etc.

理想情况下,您将f_1等放入列表并迭代,而不是为每个定义新名称,请参阅@apnorton的答案。

所以,最后:

for ff, bb in zip(f,b):
    f_nz = ff[ff != 0].size
    b_nz = bb[bb != 0].size
    print f_nz/b_nz