2016-10-01 1 views
-1

저는 파이썬으로 시작하고 있습니다. 4 개의 변수 F_1, F_2, F_3 및 F_4가 있습니다. 각각은 그 안에 행렬을 포함합니다. 각각의 0이 아닌 값을 계산하고 싶습니다. 그래서 나는 루프를 썼다.기본 파이썬 : 문자열을 함수의 입력으로 전달

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 

는 I 방정식 cv2.countNonZero((n1)/cv2.countNonZero(n2))에 입력으로 연결된 스트링 n1n2를 전달할.

여기에서 F1은 이진 이미지 (F는 전경)이고 B1도 이진 이미지 (B는 배경과 동일)입니다. 전경 대 배경이 아닌 픽셀의 비율을 계산하려고합니다.

R은 당신이 변수 이름을 참조하는 문자열을 사용하려는 사용자는 점에서 문제가

+2

어떤 식'r'에서? 나는 당신이 정수형 ('cv.countNonZero (n2)')으로'n1' (문자열)을 나눈 것처럼 보이기 때문에 약간 혼란 스럽습니다. 실제로 컴파일됩니까? 아마도 당신이하려는 것을 보여줄 수 있습니까? – apnorton

+0

나는 질문이 혼란 스럽다고 생각합니다. 당신은 값이 문자열이고 lit의 값이 변수'f_1'의 이름과 같은 함수에'n1'을 전달하기를 원합니다. 그러나 실제 의도는'f_1'의 변수 값을 전달하는 것입니다. 그리고 여러분은 반복적으로 그 시리즈의 여러 변수를 전달할 수 있도록하고 있습니다. – RejeeshChandran

+0

그게 원래의 의도였습니다. 선명도의 부족에 대해 유감스럽게 생각하지만 AP 노턴의 제안은 완벽하게 작동합니다. 추측 내가 파이썬 최대한 빨리 데이터 구조 구문을 배울 필요가 같아요! 시간을내어 주셔서 감사합니다. –

답변

1

에 그래서 ... F1/B1과 다음 반복 F2/B2에서 계산되어야한다. 이것은 상당히 어렵습니다. 목록을 사용하여 이미지를 포함하는 것이 좋습니다. 즉, 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 

나는이 기본적인 자료 구조이기 때문에 당신이 파이썬에서 목록을 사용하는 방법을 조사하는 것이 좋습니다. 또한 "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 
관련 문제