2016-10-01 7 views
-1

私はPythonを使い始めています。私は4つの変数F_1、F_2、F_3、F_4を持っています。それぞれにはマトリックスが含まれています。私はそれぞれの非ゼロ値を数えたいと思う。だから私はループを書きました。基本的なPython:文字列を関数の入力として渡す

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 

私は式cv2.countNonZero((n1)/cv2.countNonZero(n2))への入力として連結された文字列n1n2を渡したいです。

ここで、F1は2値画像(前景はF)であり、B1はまた2値画像(背景はB)である。私は前景対背景の非ゼロピクセルの比率を計算しようとしています。

rはそう

+2

何方程式 'r'で?文字列である 'n1'を整数(' cv.countNonZero(n2) ')で区切っているようですが、ちょっと混乱しています。これは実際にコンパイルされますか?おそらくあなたがしようとしていることの例を挙げることができますか? – apnorton

+0

私は質問が静かで混乱していると思います。値が文字列で、litの値が変数 'f_1'の名前と同じである関数に' n1'を渡したいとします。しかし実際の意図は 'f_1'の可変値を渡すことです。そして、そのシリーズの複数の変数をループして渡すことができるようにしています。 – RejeeshChandran

+0

はい、元の意図でした。申し訳ありませんが明確さの欠如が、APのノーノン提案は完全に動作します。私はPythonのデータ構造の構文をできるだけ早く学ぶ必要があると思います!時間をとっていただきありがとうございます –

答えて

1

にあなたは変数名を参照するように文字列を使用しようとしているという問題点を持っている... F1/B1と次の反復F2/B2のために計算する必要があります。これはかなり困難です。リストを使ってイメージを格納する方がよいでしょう。つまり、f_1f_2などを参照する代わりに、それぞれの画像を含むfという1つのリストを作成します。

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_1f_1という名前の変数)の違いがあります。あなたは(簡単に)2つの間に行くことはできません。

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 
関連する問題