2017-11-09 4 views
0

このコードは、画像を取得し、エネルギー配列を生成してから、目的の画像を通して垂直シームを計算します。 find_vertical_seam_dynamicの定義の先頭に初期化したコストとシームのリストを印刷する際に問題が発生しています。追加リストを定義から出力定義

img = skimage.io.imread('mandrill.jpg') 

def energy(image): 
    dy = np.array([-1, 0, 1])[:,None,None] 
    dx = np.array([-1, 0, 1])[None,:,None] 
    energy_img = convolve(image, dx)**2 + convolve(image, dy)**2 
    return np.sum(energy_img, axis=2) 


def find_vertical_seam_dynamic(energy_array): 

    #initiate empty lists for total cost and seam position 
    total_cost = [] 
    seam = [] 

    min_cost = np.amin(energy_array[0][:]) 
    total_cost.append(min_cost) 

    position_array = np.where(energy_array[0][:] == min_cost) 
    col = ((position_array[0]).tolist())[0] #converting numpyarray to int... 
    seam.append(col) 

    for row in range(energy_array.shape[0]): #loops over rows 

     col = seam[-1] #Column position is the last added position to the vertical seam list 

     print ("Row:", row) 
     print ("Column:",col) 
     cost = total_cost[-1] 
     print ("Cost:",cost) 

     if row == len(range(energy_array.shape[0]))-1: #Exit before checking beyond last row. 

      return 

     else: 

      if col < 0 : #bounded on the left side 

       middle = energy_array[row+1,col] 
       right = energy_array[row+1,col+1] 

       #middle neighbour is lowest 
       if middle < right: 
        min_cost = energy_array[row+1,col] 
        total_cost.append(min_cost) 

        col = col 
        seam.append(col) 

       #right neighbour is lowest 
       else: 
        min_cost = energy_array[row+1,col+1] 
        total_cost.append(min_cost) 

        col = col+1 
        seam.append(col) 


      if col >= len(range(energy_array.shape[1])): 

       left = energy_array[row+1,col-1] 
       middle = energy_array[row+1,col] 

       #left neighbour is lowest 
       if left < middle: 
        min_cost = energy_array[row+1,col-1] 
        total_cost.append(min_cost) 

        col = col-1 
        seam.append(col) 

       #middle neighbour is lowest 
       else: 
        min_cost = energy_array[row+1,col] 
        total_cost.append(min_cost) 

        col = col 
        seam.append(col) 

      else: 
       #Get energy levels for the next row 
       left = int(energy_array[row+1,col-1]) 
       middle = int(energy_array[row+1,col]) 
       right = int(energy_array[row+1,col+1]) 

       print ("\n") 
       print ("Left",left) 
       print ("middle",middle) 
       print ("right",right) 

       lowest_cost = min(left, middle, right) 

       #left neighbour is lowest 
       if left == lowest_cost: 
        min_cost = energy_array[row+1,col-1] 
        total_cost.append(min_cost) 

        col = col-1 
        seam.append(col) 

       #middle neighbour is lowest 
       if middle == lowest_cost: 
        min_cost = energy_array[row+1,col] 
        total_cost.append(min_cost) 

        col = col 
        seam.append(col) 

       #right neighbour is lowest 
       if right == lowest_cost: 
        min_cost = energy_array[row+1,col+1] 
        total_cost.append(min_cost) 

        col = col+1 
        seam.append(col) 

    return total_cost, seam 


energy_array = energy(img) 
find_vertical_seam_dynamic(energy_array) 

print (total_cost[:]) 
print (seam[:]) 

コードの最初に初期化したリストを印刷しようとする最後のセクションからエラーが表示されます。これはエラーのようです。

--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
<ipython-input-214-d447830fdced> in <module>() 
    122 find_vertical_seam_dynamic(energy_array) 
    123 
--> 124 print (total_cost[:]) 
    125 print (seam[:]) 

NameError: name 'total_cost' is not defined 

ここで私が間違っているのは本当にわかりません。他のヒントをいただければ幸いです。ありがとう。

答えて

1

find_vertical_seam_dynamicの中にtotal_costを定義してあり、その外にアクセスできないからです。変数のスコープの詳細については

total_cost, seam = find_vertical_seam_dynamic(energy_array) 

print (total_cost[:]) # also, you don't need [:] 
print (seam[:]) # same here 

読むthis:あなたは機能から必要な(total_cost & seam)の値を返すしていたよう

は、あなたがこのような何かを行う必要があります。

関連する問題