Print addended list from Definition

46 Views Asked by At

This code takes an image, generates an energy array, and then computes the vertical seam through the desired image. I'm having issues printing the lists for cost and seam that I initialized at the top of the definition of 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[:])

I'm getting an error from the last section where I try to print the lists that I initialized at the beginning of the code. This is what the error looks like

---------------------------------------------------------------------------
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

I'm not really sure where I'm going wrong here. Any other tips would be appreciated. Thanks.

1

There are 1 best solutions below

0
Ashish Ranjan On

That's becuase you've defined total_cost inside the function find_vertical_seam_dynamic which won't be accessible outside it.

As you're returning the required (total_cost & seam) values from the function, you should do something like this :

total_cost, seam = find_vertical_seam_dynamic(energy_array)

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

Read this for more details on variable scopes.