# imreggroupwise

Groupwise deformable registration

Since R2022b

## Syntax

``[dispField,reg] = imreggroupwise(moving)``
``[dispField,reg] = imreggroupwise(moving,Name=Value)``

## Description

The `imreggroupwise` function uses the total variation method to perform deformable registration of slices in a series of grayscale images. You can use this function to reduce sliding motion between slices in a series of medical images, such as a timeseries. Registering all slices of the series to one of the slices using deformable registration in a `for` loop can introduce bias towards the artifacts of one slice in all the slices. In contrast, the `imreggroupwise` function reduces the overall range of sliding motion across all slices.

````[dispField,reg] = imreggroupwise(moving)` transforms the slices in the image series `moving` so that they are groupwise registered, and returns the displacement field `dispField` and the registered image series `reg`.```

example

````[dispField,reg] = imreggroupwise(moving,Name=Value)` specifies options for the total variation method using one or more optional name-value arguments.```

## Examples

collapse all

Load an MRI volume into the workspace.

```imgs = load("mristack.mat"); imgs = squeeze(imgs.mristack);```

Pad the slices of the MRI volume to allow for rotation.

`imgs = padarray(imgs,[10 10],"both");`

Extract the 10th slice of the MRI volume, to use to generate the moving image series.

`paddedSlice = imgs(:,:,10);`

Generate the moving image series by rotating the slice by different angles.

```moving = zeros(276,276,27); for i = 1:27 moving(:,:,i) = imrotate(paddedSlice,i,"crop"); end```

Perform groupwise registration of the slices of the moving image series.

`[dispField,reg] = imreggroupwise(moving,GridRegularization=0.05);`
```--------------------------- Pyramid Level = 3 -------------------------------- Closeness to Iteration f(x) Step-size optimal solution 1 160720.92 11.50 18.19431 2 146622.17 41.61 31.55621 3 137582.30 54.80 37.51630 4 131892.89 21.32 30.22352 5 129146.80 12.05 27.98123 6 126260.51 18.80 34.57209 7 123292.77 21.42 32.76271 8 119756.72 34.44 26.53227 9 117145.16 27.64 33.13160 10 114257.37 28.72 39.06536 11 111212.99 50.30 35.02401 12 108848.93 28.47 27.27366 13 106838.15 16.68 21.59996 14 104141.37 48.40 29.34133 15 103034.70 43.98 36.78617 16 101421.24 11.33 21.98658 17 99846.91 25.65 19.28558 18 98950.73 20.29 22.02194 19 97683.82 55.50 23.47823 20 97058.47 35.79 56.52787 21 95693.10 12.29 39.94096 22 94308.28 31.93 50.77296 23 93620.93 21.01 23.42839 24 92756.49 43.04 26.44428 25 92160.48 39.07 20.02188 26 91649.86 20.14 23.32969 27 90848.45 52.28 12.75790 28 90785.24 35.18 50.98939 29 89193.25 13.04 24.02603 30 87913.57 26.84 23.86608 31 87261.74 13.25 27.18752 32 86609.40 28.99 20.23212 33 86403.18 36.29 19.85028 34 86171.97 12.29 14.73627 35 85991.59 43.41 19.17823 36 85880.43 31.97 52.82440 37 84848.06 22.60 38.11074 38 83896.58 24.78 26.63796 39 83221.23 17.79 31.42078 40 82422.75 15.26 17.38349 41 82386.70 42.07 30.26392 42 82118.45 10.10 20.60638 43 81714.94 31.01 27.63559 44 81475.85 25.61 35.72504 45 81219.57 11.81 30.83450 46 80900.59 42.13 21.99698 47 80701.15 27.56 46.08761 48 79735.79 18.84 29.77860 49 78885.47 19.72 21.33987 50 78443.85 14.00 33.84345 51 78025.38 19.61 21.81821 52 77820.46 10.80 27.58759 53 77566.30 14.89 14.12064 54 77356.17 16.30 24.02455 55 77210.20 17.62 13.38399 56 77175.39 16.57 13.65389 57 77139.47 16.67 14.31732 58 77103.48 16.91 14.75186 59 77052.18 18.54 13.45865 60 77007.15 17.58 11.45708 61 76995.53 6.92 12.12129 --------------------------- Pyramid Level = 2 -------------------------------- Closeness to Iteration f(x) Step-size optimal solution 1 90397.57 9.98 16.07776 2 88598.63 13.10 23.03916 3 86659.87 23.18 36.97704 4 85346.69 26.94 46.28403 5 83821.96 9.70 20.80432 6 82514.48 16.43 25.34133 7 81522.62 18.21 27.43884 8 80714.91 45.26 44.56642 9 79515.86 16.33 17.96243 10 78667.76 10.10 25.12929 11 77756.18 24.19 27.73775 12 77571.40 32.06 51.91825 13 76629.12 7.86 22.85993 14 75929.67 19.14 31.05180 15 75590.59 16.23 14.57161 16 75563.08 47.79 52.11658 17 74964.02 19.25 34.85287 18 74383.90 8.57 36.63964 19 73887.61 25.26 20.34162 20 73676.18 8.94 12.66080 21 73360.07 26.43 19.09864 22 73190.90 31.92 33.94272 23 73032.36 10.59 20.21763 24 72764.07 32.08 14.04518 25 72626.99 24.21 27.84766 26 72493.83 30.79 28.66531 27 72090.89 18.12 17.14031 28 71660.52 18.11 11.76067 29 71269.90 15.98 24.21175 30 71067.73 22.38 15.58385 31 70985.12 8.50 14.58411 32 70888.81 11.41 13.56274 33 70796.71 14.63 12.23691 34 70729.12 15.27 12.57831 35 70721.71 14.16 12.59730 36 70716.14 5.36 12.87683 --------------------------- Pyramid Level = 1 -------------------------------- Closeness to Iteration f(x) Step-size optimal solution 1 80123.51 13.71 13.80900 2 78453.64 14.18 11.56824 3 76729.32 27.24 26.34447 4 75799.10 26.53 37.72128 5 74508.05 9.21 19.73064 6 73460.13 20.96 27.40239 7 72800.90 16.67 26.18356 8 71919.69 32.43 14.43351 9 71545.75 30.56 32.57132 10 70717.01 15.97 18.49375 11 70052.45 19.04 22.48044 12 69587.50 17.23 23.88982 13 69094.55 28.76 22.76715 14 68720.48 24.05 24.80507 15 68212.79 16.41 14.46844 16 67766.80 23.74 14.20388 17 67589.19 23.70 29.27166 18 67121.86 14.29 13.96609 19 66779.83 23.35 12.63738 20 66611.24 19.61 21.53575 21 66390.03 23.81 15.41449 22 66226.75 9.53 10.36505 23 66174.37 35.33 14.71976 24 66046.98 6.29 11.75380 25 65777.74 20.41 21.22998 26 65694.36 26.64 37.03862 27 65478.70 9.46 33.20081 28 65330.62 28.51 30.64879 29 65193.94 14.45 30.87433 30 64969.61 20.04 27.73873 31 64863.63 7.47 23.45422 32 64742.49 10.56 18.98134 33 64655.24 11.63 19.72796 34 64589.34 12.86 11.98109 35 64575.96 6.52 13.75064 36 64563.45 8.01 13.59998 37 64558.37 3.78 12.33042 ```

Visualize the output of the groupwise registration. The mean image of the moving image series shows that the slices are misaligned. In contrast, the mean image of the registered image series indicates alignment across slices.

```figure imshow([paddedSlice,mean(moving,3),mean(reg,3)]) title("Original Image | Mean Image of Moving Image Series " + ... "| Mean Image of Registered Image Series")```

## Input Arguments

collapse all

Image series to be registered, specified as a 3-D numeric array. The slices in the image series must capture the same anatomical slice of the body. For example, the image series can be a collection of the same slice imaged at different times.

Data Types: `single` | `double` | `int8` | `int16` | `int32` | `int64` | `uint8` | `uint16` | `uint32` | `uint64`

### Name-Value Arguments

Specify optional pairs of arguments as `Name1=Value1,...,NameN=ValueN`, where `Name` is the argument name and `Value` is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Example: `[dispField,reg] = imreggroupwise(moving,NumPyramidLevels=6)` registers the slices of `moving` using six pyramid levels.

Grid spacing, specified as a two-element numeric vector. Smaller values of `GridSpacing` specify a finer grid resolution.

Data Types: `double`

Pixel size, specified as a two-element numeric vector. Values are in millimeters.

Data Types: `double`

Number of multiresolution pyramid levels, specified as a positive integer.

If `moving` is of size M-by-N-by-P, then the value of `NumPyramidlevels` must satisfy the condition ```min([M N P]) > (2^NumPyramidLevels)*0.7```.

Data Types: `single` | `double` | `int8` | `int16` | `int32` | `int64` | `uint8` | `uint16` | `uint32` | `uint64`

Weighing factor for grid displacement regularization, specified as a nonnegative scalar.

A large value for `GridRegularization` can create a smooth output displacement field, whereas a small value can create more localized displacements.

Data Types: `double`

Progress information output, specified as a numeric or logical `1` (`true`) or `0` (`false`). Specify `DisplayProgress` as `true` to display information such as the number of iterations, normalized root mean square error (RMSE), function local minima, step size, and closeness to optimal solution.

Data Types: `single` | `double` | `int8` | `int16` | `int32` | `int64` | `uint8` | `uint16` | `uint32` | `uint64` | `logical`

## Output Arguments

collapse all

Displacement field, returned as a 4-D numeric array.

If `moving` is of size M-by-N-by-P, the displacement field `dispField` is a 4-D numeric array of size M-by-N-by-2-by-P, where `dispField(:,:,1,:)` and `dispField(:,:,2,:)` contain the displacements for each of the slices in the X- and Y- directions, respectively.

Registered image series, returned with the same size and data type as `moving`.

## References

[1] Vishnevskiy, Valery, Tobias Gass, Gabor Szekely, Christine Tanner, and Orcun Goksel. “Isotropic Total Variation Regularization of Displacements in Parametric Image Registration.” IEEE Transactions on Medical Imaging 36, no. 2 (February 2017): 385–95. https://doi.org/10.1109/TMI.2016.2610583.

## Version History

Introduced in R2022b