0

This has been asked before so apologies for asking again, I have followed the suggested solutions provided in these answers and this, but I'cant seem to remove my error.

I've tried changing object type for the slope list and vals range but still I get the error. I ducked into the polynomial.py script but I don't understand the line of code listed in the error.

Overall I'm trying to separate an 8-bit grayscale image into individual arrays based on the grayscale values (0-255), generate a line of best fit for each value, then use each of the slopes from the lines of best fit to get an overall line of best fit for the image.

Here's my code:

image = Image.open('subfram-002.tif')
im_array = np.array(image)
#print(im_array)
####
multivec = []
####
# For loop to calculate the line of best fit for each value in the    sub-frame array
arrays = [im_array] # Calling our array
vals = list(range(255)) # Range of values in array
slopes = [] # List to append each of the slopes of the line of best fit
skip = False
for i in arrays:
    for j in vals:
        index = list(zip(*np.where (j == i))) # Creating a list of the position indices for each value in the array
        in_array = np.array(index) # Updating list to array, not needed will remove

        a = list([int(i[0]) for i in index]) # Getting the first element of each tuple in the index list
        b = list([int(i[1]) for i in index]) # Getting the second element of each tuple in the index list
        # Add exception for vectors that are not generated due to values in 0-255 not being present
        if len(a) == 0:
            skip = True
        elif len(b) == 0:
            skip = True
        else:
            vec = list((np.poly1d(np.polyfit(a,b,1))).c) # Calculating list of best (1st order polynomial, consider increasing the order?)
            slope = float(vec[0]) # Getting the 1st coefficient of the line of best fit, which is the slope
            slopes.append(slope) # appending each slope to a list of slopes

print(type(slopes), type(vals))

slopes += ['0'] * (255 - len(slopes)) # Padding slope list in case less then 255 slopes generated

print(len(vals))

# Take in all of the slopes from each vector that is determined for each value
vec1 = (np.poly1d(np.polyfit(slopes,vals,1))).c # Determining the overall line of best fit for the array, using the slope of the vector as the comparator between sub-frames

Here's my error:

<class 'list'> <class 'list'>
255
Traceback (most recent call last):
  File "aryslop.py", line 53, in <module>
    vec1 = (np.poly1d(np.polyfit(slopes1,vals1,1))).c # Determining the overall line of best fit for the array, using the slope of the vector as the comparator between sub-frames
  File "/home/vanoccupanther/anaconda3/lib/python3.5/site-packages/numpy/lib/polynomial.py", line 549, in polyfit
    x = NX.asarray(x) + 0.0
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')
Community
  • 1
  • 1

1 Answers1

1

I solved this (I hope), I created new lists by iterating through each of the vals range and slopes list, turning each of the objects contained in each into floats. I had done that already inside my for loop so I should have just done that earlier.