seung-lab / connected-components-3d

Connected components on discrete and continuous multilabel 3D & 2D images. Handles 26, 18, and 6 connected variants; periodic boundaries (4, 8, & 6)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

How to remove small object [3d volume] using cc3d.connected_components ?

selvakarna opened this issue · comments

How to remove small object [3d volume] using cc3d.connected_components ?

This snippet should do it for you. :)

cc_labels = cc3d.connected_components(img)
cc_segids, pxct = np.unique(cc_labels, return_counts=True)
mask_ids = [ sid for sid, ct in zip(cc_segids, pxct) if ct < dust_threshold and sid != 0 ]
cc_labels[ np.in(cc_labels, mask_ids) ] = 0

If you're willing to download another dependency I also write a package called fastremap that can do it like so, which may be slightly faster or less memory intensive:

cc_labels = cc3d.connected_components(img)
cc_segids, pxct = np.unique(cc_labels, return_counts=True)
mask_ids = [ sid for sid, ct in zip(cc_segids, pxct) if ct < dust_threshold and sid != 0 ]
cc_labels = fastremap.mask(cc_labels, mask_ids)

Thanks william-silversmith.

You're welcome!

from this above code:

cc_labels = cc3d.connected_components(img)
cc_segids, pxct = np.unique(cc_labels, return_counts=True)
mask_ids = [ sid for sid, ct in zip(cc_segids, pxct) if ct < dust_threshold and sid != 0 ]
cc_labels[ np.in(cc_labels, mask_ids) ] = 0

when i use volume image to this above code, nothing 3d small object removed ? so how to remove small 3d volume object? i set dust_threshold= 50, but its not working[ small object cannot removed] ?
@william-silversmith

For anyone reading this thread these days, cc3d.dust is available as of 3.7.0 which will remove components smaller than a specified number of voxels. If you want to do something fancy like "as a fraction of the size of the largest shape" you can do a pass with cc3d.statistics to compute it.