mahotas icon indicating copy to clipboard operation
mahotas copied to clipboard

erode/dilate offset integers by -1/+1

Open thouis opened this issue 12 years ago • 5 comments

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

thouis avatar Feb 21 '13 17:02 thouis

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.

luispedro avatar Feb 21 '13 20:02 luispedro

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?

thouis avatar Feb 21 '13 20:02 thouis

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.

luispedro avatar Feb 22 '13 13:02 luispedro

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.

thouis avatar Feb 22 '13 14:02 thouis

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?

ErichZimmer avatar Dec 12 '22 17:12 ErichZimmer