我刚刚开始使用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
我想将连接的字符串n1
和n2
作为输入传递给等式cv2.countNonZero((n1)/cv2.countNonZero(n2))
。
这里F1是二进制图像(F与前景一样),B1也是二进制图像(B与背景中一样)。我试图计算前景与背景中非零像素的比例。
r应计算F1 / B1,并在下一次迭代F2 / B2 ......等等
答案 0 :(得分:1)
您遇到的问题是您尝试使用字符串来引用变量名称。这很难做到;你最好使用列表来包含你的图像。也就是说,不要尝试引用f_1
,f_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