[Neuroimaging] [Nibabel] Crop image volume?

Christopher Markiewicz effigies at bu.edu
Fri Aug 18 11:39:38 EDT 2017


Michael,

It's easier than it first looks. Steps 1 and 2, assuming a skull-stripped
image:

mask = nb.load(brainmask)
bounds = np.sort(np.vstack(np.nonzero(mask.get_data())))[:, [0, -1]]
x, y, z = bounds

new_data = mask.get_data()[x[0]:x[1], y[0]:y[1], z[0]:z[1]]

Step 3:

Given A, we want to find A' that is identical up to the intercept, such
that A * [x_0, y_0, z_0, 1]' == A' * [0, 0, 0, 1].
Conveniently, A' * [0, 0, 0, 1]' is the fourth row in the affine matrix, so
we're done as soon as we calculate the LHS:

new_aff = mask.affine.copy()
new_aff[:, [3]] = mask.affine.dot(np.vstack((bounds[:, [0]], [1])))

new_img = nb.Nifti1Image(new_data, new_aff, mask.header)

Chris


On Fri, Aug 18, 2017 at 11:00 AM, Michael Waskom <mwaskom at nyu.edu> wrote:

> Hi Matthew,
>
> Is there a nibabel function to crop a 3D image? I want to resample data to
> match my anatomical, but to save space I want to crop the anatomical on the
> xyz dimensions to a tight box around the brain volume.
>
> In other words I want to take:
>
> >>> img.shape
> --> (256, 256, 256)
> >>> cropped_img = nib.crop_image(img, [(50, 200), (50, 200), (50, 200)])
> >>> cropped_img.shape
> --> (150, 150, 150)
>
> If there isn't a function to do this, could you share a recipe for what
> I'd need to do? My sense is I'd need to a) pass a cropped data array (easy)
> b) change the data shape information in the header (easy) c) change the
> fourth column of the affine matrix (tricky!)
>
> Thanks,
> Michael
>
> _______________________________________________
> Neuroimaging mailing list
> Neuroimaging at python.org
> https://mail.python.org/mailman/listinfo/neuroimaging
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/neuroimaging/attachments/20170818/1150baae/attachment.html>


More information about the Neuroimaging mailing list