Reputation: 788
I am using skimage to fill holes a binary input image (left side). This is my code
from skimage import ndimage
img_fill_holes=ndimage.binary_fill_holes(binary).astype(int)
However, the result of the above code cannot completely fill holes to the binary image. It means the output still remains the holes inside the circle. How can I completely fill all holes inside the circle?
Upvotes: 5
Views: 19981
Reputation: 1257
if you have the 3D array, just change the structure
to a 3d array.
import SimpleITK as sitk
from scipy import ndimage
brain_mask_raw = sitk.ReadImage('/PATH/TO/brain_mask.nii.gz')
brain_mask_array = sitk.GetArrayFromImage(brain_mask_raw)
brain_mask_array_filled = ndimage.binary_fill_holes(brain_mask_array, structure=np.ones((3,3,3))).astype(int)
brain_mask_filled = sitk.GetImageFromArray(brain_mask_array_filled.astype(brain_mask_array.dtype)).CopyInformation(brain_mask_raw)
sitk.WriteImage(brain_mask_filled, '/RESULT/PATH/brain_mask_filled.nii.gz')
ref:scipy doc for binary fill holes
Upvotes: 0
Reputation: 4195
you were probably tried to apply binary_fill_holes
on an RGB image (a 3D matrix, do binary.shape[2] == 3
to check that).
try:
img_fill_holes = ndimage.binary_fill_holes(binary[:,:,0]).astype(int)
or any other "rgb2gray" approach and you should get the expected output
Upvotes: 6