# Computing the weighted centroid dependent on previous row/column

I am working on a project for a Raspberry Pi that requires some image processing.

The aim is to find a white line on a black background by finding the weighted mean in each row/column. However to avoid this being skewed by other parts of the path that may also be in the picture I want to restrict the mean to within a tolerance of the last centroid computed with a known value for the first row/column As a mainly C++ programmer I initially wrote this code using for loops but this is very slow in python.

I have started reading about numpy arrays and vectorisation, however I am struggling to see how I might use them because of the dependency on the previous value calculated. This is my current attempt:

img = Image.open('Test2.png')

img = img.convert('L')
print("Size of image is:")
size = img.size
print(img.format, img.size, img.mode)

pixels = np.asarray(img)
width, height = img.size

average_index_rows = []
average_index_rows.append(int(width/2))
average_index_cols = []
average_index_cols.append(int(height/2))
tol = 20

for cc in range(0, width):
min_index = max(0, average_index_cols[cc] - 20)
max_index = min(height, average_index_cols[cc] + 20)
sub_array = np.asarray(pixels[cc, min_index:max_index])
y = sub_array.sum()
next_centroid = compute_weighted_centroid((sub_array))
if next_centroid!= next_centroid:
break
else:
average_index_cols.append(next_centroid)

for rr in range(0, height):
min_index = max(0, average_index_rows[rr]-20)
max_index = min(height, average_index_rows[rr]+20)
sub_array = pixels[min_index:max_index, rr]
next_centroid = compute_weighted_centroid((sub_array))
if next_centroid!= next_centroid:
break
else:
average_index_rows.append(next_centroid)

img = img.convert('RGB')

for rr in range(1, len(average_index_rows)):
if average_index_rows[rr] != -1:
current_average_pixel = average_index_rows[rr]

for pixel in range(-3,3):
if (current_average_pixel+pixel > 0) and (current_average_pixel+pixel < height):
img_pixel[rr-1, current_average_pixel+pixel ] = (255,10,10)

for cc in range(1, len(average_index_cols)):
if average_index_cols[cc] != -1:
current_average_pixel = average_index_cols[cc]

for pixel in range(-3,3):
if (current_average_pixel+pixel > 0) and (current_average_pixel+pixel < width):
img_pixel[current_average_pixel+pixel, cc-1 ] = (10,255,10)

img.show()


Is there a better way to formulate this to improve the speed?