[ITK] N4 Bias Correction in Python

Matt McCormick matt.mccormick at kitware.com
Thu Oct 5 18:35:28 EDT 2017


Dear Addison,

On Wed, Oct 4, 2017 at 11:34 AM, Addison Elliott
<addison.elliott at gmail.com> wrote:
> I need to perform N4 bias correction in Python on two sets of MRI scans. I
> am using the default settings for N4BiasFieldCorrectionImageFilter.
> Beforehand, I shrink the image by a factor of 4x to speed up the processing.
>
> However, the issue with that is I lose resolution when I get the output
> image. I would like to use a shrink factor of 4x but keep the initial
> resolution.
>
> An example of how to do that in C++ is shown here:
> https://github.com/midas-journal/midas-journal-640/blob/master/Source/itkN3MRIBiasFieldCorrectionImageFilterTest.cxx
>
> My issue is that BSplineControlPointImageFilter is not wrapped in Python.
> Just about everything else in that module is. I took a look at the source
> code for the module and it would take me a few weeks to understand and
> implement that in Python.
>
> So here are my series of questions:
>
> How can I go about wrapping BSplineControlPointImageFilter in Python? I'm
> willing to build the source code to do so.

A explanation for the wrapping system can be found in the ITK Software Guide:

  https://itk.org/ITKSoftwareGuide/html/Book1/ITKSoftwareGuide-Book1ch9.html#x48-1540009.5

To understand the filter, first look at its class declaration,

  https://github.com/InsightSoftwareConsortium/ITK/blob/9ed88517d771bcbbcd5293e59c7aece9fa411145/Modules/Filtering/ImageGrid/include/itkBSplineControlPointImageFilter.h#L59-L61

It is an ImageToImageFilter with two template arguments, TInputImage
and TOutputImage. Since TOutputImage defaults to TInputImage, we can
assume common usage is to use the same type for TInputImage and
TOutputImage, and only wrap with the same type.

A good (untested) started point is to add:

itk_wrap_class("itk::BSplineControlPointImageFilter" POINTER)
  itk_wrap_image_filter("${WRAP_ITK_SCALAR}" 2)
itk_end_wrap_class()

to the file

  ITK/Modules/Filtering/ImageGrid/wrapping/itkBSplineControlPointImageFilter.wrap.


> Assuming I decide to go the route of wrapping
> BSplineControlPointImageFilter, how can I go about contributing my code to
> the project?

Your contributions are welcome! Please see https://itk.org/Wiki/ITK/Git/Develop
on how to contribute a patch. We are also migrating this content to
markdown files:

  http://review.source.kitware.com/#/c/22654/

Your reviews and feedback are welcome.

Additional information on our community software process can be found
in the ITK Software Guide:

  https://itk.org/ITKSoftwareGuide/html/Book1/ITKSoftwareGuide-Book1ch10.html#x49-16200010



> I'm confused as to whether you are using GitHub or your own Git server for
> contributions? There is a GitHub project link with no pull requests that I
> could contribute too. But there's also your git server on itk.org which has
> more active contributions.

We are currently migrating from a Gerrit-based code review process to
GitHub. Sorry for any confusion.

The GitHub, itk.org/ITK.git, and Gerrit repositories are kept in sync.


> I'm unable to sign up for Gerrit access as described on this link.
> https://itk.org/Wiki/ITK/Git/Account#Gerrit Am I supposed to mail any
> patches?

You should be able to use your GitHub account to login. Did that not work?

Patches can also be sent to the mailing list.


> As a temporary solution, is it valid to do this to get the bias field:
>          v(x) = u(x)f(x) + n(x)
>
> But since noise is ignored according to Sled's paper, it becomes:
>         v(x) = u(x)f(x)
>
> Can I do this?
>         f(x) = u(x) / v(x)

Offhand, I am not sure of these details.


Thanks,
Matt


More information about the Community mailing list