从定义打印添加的列表

2024-06-06 14:32:47 发布

您现在位置:Python中文网/ 问答频道 /正文

该代码获取一个图像,生成一个能量数组,然后通过所需图像计算垂直接缝。我在打印我在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

我真的不确定我到底哪里出了问题。任何其他提示都将不胜感激。谢谢


Tags: rightmiddleiscolminarrayleftenergy
1条回答
网友
1楼 · 发布于 2024-06-06 14:32:47

这是因为您已经在函数find_vertical_seam_dynamic内部定义了total_cost,而函数外部无法访问该函数

当您返回所需的(total_cost&seam)值,您应该执行以下操作:

total_cost, seam = find_vertical_seam_dynamic(energy_array)

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

有关变量作用域的详细信息,请阅读this

相关问题 更多 >