Hello.

I'm developing a video extensometer based on the identification of center of mass of circular white mark on  a black rubber specimen.

In order to deal with data in real time I have to be fast (over 100 fps). So I first identify the Zones Of Interests using this example :
http://scikit-image.org/docs/dev/auto_examples/plot_label.html

Then I compute the center of mass on each ZOI.

As I have a fast camera the ZOI between two successive images doesn't  change much. So if I extend the bounding box of my current ZOI I could be pretty confident in the fact that given circular mark in the next picture will be in the extended ZOI and the recompute an updated extened ZOI for the next image.

So this is the big picture.

You will find bellow the function I use in order to get it  :
def barycenter(image_,minx_,miny_,maxx_,maxy_,thresh_,border_):
  bw_
=image_[minx_:maxx_+1,miny_:maxy_+1]>thresh_
 
[Y,X]=np.meshgrid(range(miny_,maxy_+1),range(minx_,maxx_+1))
  region
=regionprops(bw_)
  minx
,miny,maxx,maxy=region[0].bbox
 
Px_=(X*bw_).sum().astype(float)/bw_.sum()
 
Py_=(Y*bw_).sum().astype(float)/bw_.sum()
  minx_
=X[minx,miny]-border_
  miny_
=Y[minx,miny]-border_
  maxx_
=X[maxx,maxy]+border_
  maxy_
=Y[maxx,maxy]+border_
 
return Px_,Py_,minx_,miny_,maxx_,maxy_
 
As you can see I don't use region[0].centroid. I compute the moment myself

if I time my function on a 141x108 ZOI I get 504 µs

If I time this function :

def barycenter2(image_,minx_,miny_,maxx_,maxy_,thresh_,border_):
  bw_
=image_[minx_:maxx_+1,miny_:maxy_+1]>thresh_
 
[Y,X]=np.meshgrid(range(miny_,maxy_+1),range(minx_,maxx_+1))
  region
=regionprops(bw_)
 
Px_,Py_=region[0].centroid
 
Px_+=minx_
 
Py_+=miny_  
  minx
,miny,maxx,maxy=region[0].bbox
  minx_
=X[minx,miny]-border_
  miny_
=Y[minx,miny]-border_
  maxx_
=X[maxx,maxy]+border_
  maxy_
=Y[maxx,maxy]+border_
 
return Px_,Py_,minx_,miny_,maxx_,maxy_


I get 10ms per loop !

What is really strange is if I time :

%timeit region[0].centroid
 I get 58.6 ns per loop !

So I don't really understand why this time explose when I use it in a function ?

If someone have some insight it will be very helpfull. Even If I can use my first function, it's a pity to have to use less optimized functions.

Best regards.