从“定义”中打印带有广告的列表

时间:2017-11-09 07:13:38

标签: python loops numpy seam

此代码拍摄图像,生成能量数组,然后通过所需图像计算垂直接缝。我在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 个答案:

答案 0 :(得分:1)

这是因为你已经在函数total_cost中定义了find_vertical_seam_dynamic,但在其外部无法访问它。

当您从函数返回所需的(total_cost&amp; seam)值时,您应该执行以下操作:

total_cost, seam = find_vertical_seam_dynamic(energy_array)

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

阅读this以获取有关变量范围的更多详细信息。