2016-10-01 101 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 

我想將串聯字符串n1n2作爲輸入傳遞給方程cv2.countNonZero((n1)/cv2.countNonZero(n2))

這裏F1是一個二進制圖像(前景中的F),B1也是二進制圖像(背景中的B)。我正試圖計算前景與背景中非零像素的比例。

[R應該被計算F1/B1,並在接下來的迭代F2/B2 ......等等

+2

在'r'什麼公式?我有點困惑,因爲它看起來像是用一個整數('cv.countNonZero(n2)')來分割'n1'(這是一個字符串)。這實際上編譯?你能舉一個你想要做什麼的例子嗎? – apnorton

+0

我認爲這個問題非常令人困惑,你希望將'n1'傳遞給一個函數,該函數的值是一個字符串,並且lit的值與變量'f_1'的名字相同。但是你的實際意圖是傳遞'f_1'的變量值。你正在這樣做,以便你可以循環並傳遞該系列的多個變量。 – RejeeshChandran

+0

是的,這是最初的意圖。抱歉,由於缺乏清晰度,但AP諾頓的建議完美。猜猜我需要學習python中的數據結構語法!謝謝大家花時間 –

回答

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
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 
相關問題