pmneila / PyMaxflow

Python library for creating flow networks and computing the maxflow/mincut (aka graph-cuts for Python)
http://pmneila.github.io/PyMaxflow/
242 stars 59 forks source link

3D grid support (take 2) #43

Open mxhf opened 4 years ago

mxhf commented 4 years ago

Hi,

I am trying to create a 3D grid like

nodes = g.add_nodes( (c.shape[0],c.shape[1],c.shape[2]) ) (c is a 3D numpy array)

But am getting TypeError: an integer is required

Any suggestions?

Max

pmneila commented 4 years ago

Hi @mxhf,

add_nodes expects a single integer and creates as many nodes as indicated by that integer. I think you might be looking for add_grid_nodes, which takes a tuple of integers:

nodes = g.add_grid_nodes( (c.shape[0], c.shape[1], c.shape[2]) )

Also note that if c is a 3D array, you can simply write:

nodes = g.add_grid_nodes(c.shape)

Regards!

mxhf commented 4 years ago

OK, I clearly should have been able to figure this out myself. Many thanks!

Quick additional question though.

I'd like to be able to set the "structure" or costs according to neighboring pixel value differences (in a 3D pixel cube).

And idea on how to achieve this while pushing it to the c++ layer. Doing it a python loop takes foerever.

Max

On Fri, Aug 23, 2019 at 11:14 PM pmneila notifications@github.com wrote:

Closed #43 https://github.com/pmneila/PyMaxflow/issues/43.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/pmneila/PyMaxflow/issues/43?email_source=notifications&email_token=AB2AZST6B6XUF3LASUCG62TQGBHLJA5CNFSM4IPCG4K2YY3PNVWWK3TUL52HS4DFWZEXG43VMVCXMZLOORHG65DJMZUWGYLUNFXW5KTDN5WW2ZLOORPWSZGOTHKOVVQ#event-2580867798, or mute the thread https://github.com/notifications/unsubscribe-auth/AB2AZSQ2BRK6RCU734EI6N3QGBHLJANCNFSM4IPCG4KQ .

--

Maximilian Fabricius

pmneila commented 4 years ago

Hi @mxhf,

Have you looked at the layout_example3D.py? It builds a 3D graph and then connects nodes with a specific pattern (that of course can be adapted to your needs). Is this what you want?

mxhf commented 4 years ago

I have (now), yes I know the custom structure

ala

structure = np.array([[[0, 1, 0],
                        [1, 1, 1],
                        [0, 1, 0]],
                       [[0, 1, 0],
                        [1, 0, 1],
                        [0, 1, 0]],
                       [[0, 1, 0],
                        [1, 1, 1],
                        [0, 1, 0]]])

but I want to adjust the structure on a pixel by pixel basis. Essentially the interpixel edge capacity should be a function of the pixel value differences.

This is easy of course if I do it in python but slow.

Max

On Mon, Aug 26, 2019 at 2:49 PM pmneila notifications@github.com wrote:

Reopened #43 https://github.com/pmneila/PyMaxflow/issues/43.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/pmneila/PyMaxflow/issues/43?email_source=notifications&email_token=AB2AZSVDD5TURBVT2M44SNTQGPGNLA5CNFSM4IPCG4K2YY3PNVWWK3TUL52HS4DFWZEXG43VMVCXMZLOORHG65DJMZUWGYLUNFXW5KTDN5WW2ZLOORPWSZGOTH7CQJA#event-2583570468, or mute the thread https://github.com/notifications/unsubscribe-auth/AB2AZSQLBX47O63GZGE7FHTQGPGNLANCNFSM4IPCG4KQ .

--

Maximilian Fabricius

nirmalsnair commented 2 years ago

You could use numba to speed-up your Python loops. Usually, I get 10-100x speed-up.

https://numba.pydata.org/