luispedro / mahotas

Computer Vision in Python
https://mahotas.rtfd.io
Other
844 stars 148 forks source link

erode/dilate offset integers by -1/+1 #29

Open thouis opened 11 years ago

thouis commented 11 years ago

Booleans are fine.

>>> mahotas.erode(np.array([[0,0,0,1,1,1],[0,0,0,1,1,1],[0,0,0,1,1,1],], dtype=np.bool))
array([[False, False, False, False,  True,  True],
       [False, False, False, False,  True,  True],
       [False, False, False, False,  True,  True]], dtype=bool)
>>> mahotas.dilate(np.array([[0,0,0,1,1,1],[0,0,0,1,1,1],[0,0,0,1,1,1],], dtype=np.bool))
array([[False, False,  True,  True,  True,  True],
       [False, False,  True,  True,  True,  True],
       [False, False,  True,  True,  True,  True]], dtype=bool)
>>> mahotas.dilate(np.array([[0,0,0,1,1,1],[0,0,0,1,1,1],[0,0,0,1,1,1],], dtype=np.int32))
array([[1, 1, 2, 2, 2, 2],
       [1, 1, 2, 2, 2, 2],
       [1, 1, 2, 2, 2, 2]], dtype=int32)
>>> mahotas.erode(np.array([[0,0,0,1,1,1],[0,0,0,1,1,1],[0,0,0,1,1,1],], dtype=np.int32))
array([[-1, -1, -1, -1,  0,  0],
       [-1, -1, -1, -1,  0,  0],
       [-1, -1, -1, -1,  0,  0]], dtype=int32)
>>> mahotas.__version__
'0.9.7'
>>> 
luispedro commented 11 years ago

What did you expect the result to be?

The default is that the structuring element is::

np.ones([
       [0,1,0],
       [1,1,1],
       [0,1,0]])

It's late in the day, so I could be misthinking this, but it seems that greyscale erosion should result in zero-valued areas to become -1.

thouis commented 11 years ago

I was confused. However, it's not clear from the docs the difference between the structuring element neighborhood and structuring element value. Is the SE neighborhood all nonzero entries, or are they denoted some other way?

luispedro commented 11 years ago

Ok, I think the problem might be the documentation.

mahotas uses the pymorph convention (I maintain pymorph, but I didn't start it; so, I inherited this convention): the structuring element is its values, except that the lowest possible value (-2147483648 in np.int32) indicates minus infinity.

I am not sure I completely buy this convention, but I adopted it.

thouis commented 11 years ago

Ok. This was partly me not understanding the generalization of binary erosion to grayscale, having only used it with 0-height structuring elements. You might document that as well, for confused people like me.

I'll try to submit a PR to the docs sometime next week, if you don't get to it.

ErichZimmer commented 1 year ago

I am not entirely sure my comment fits here, but when I perform phase separation through erosion and dilation, I get completely different results from scipy. Further testing with particle image velocimetry image pairs yields results that were not suitable for further processing. Perhaps, following a convention like scipy would be better? Or am I simply misinterpreting the results and need to scale them in some fashion?