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.