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