Как я могу выполнить регистрацию 3D-изображения с помощью SimpleElastix от Python? - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь зарегистрировать два 3d тома.Попытка это может найти здесь .Сначала код генерирует два разных тома, каждый из которых содержит ровно одну сферу радиуса 4. Затем я пытаюсь выровнять их, используя карту параметров перевода по умолчанию.Однако, как видно из последней строки (и из графиков при локальном запуске), результирующий том вообще не выровнен с фиксированным объемом.При попытке выполнить ту же процедуру, в этот раз в 2d полученное изображение выглядит правильно выровненным с фиксированным изображением, как видно здесь .Я неправильно использую SimpleElastix API?Я просмотрел репозиторий Github в SimpleElastix, но не смог найти никаких примеров регистрации 3D-изображений (по крайней мере, не используя тома, сгенерированные в Python, а затем преобразовав их в изображения ITK).

Код из примера 3d:

vol1 = np.zeros((50, 50, 50))
for x in range(vol.shape[0]):
    for y in range(vol.shape[1]):
        for z in range(vol.shape[2]):
            vol1[x, y, z] = np.linalg.norm(np.subtract([x, y, z], [5, 3, 2])) < 4

vol2 = np.zeros((50, 50, 50))
for x in range(vol.shape[0]):
    for y in range(vol.shape[1]):
        for z in range(vol.shape[2]):
            vol1[x, y, z] = np.linalg.norm(np.subtract([x, y, z], [20, 30, 10])) < 4

img_a = sitk.GetImageFromArray(vol1)
img_b = sitk.GetImageFromArray(vol2)

parameterMap = sitk.GetDefaultParameterMap('translation')

itk_filter = sitk.ElastixImageFilter()
itk_filter.LogToConsoleOn()
itk_filter.SetFixedImage(img_a)
itk_filter.SetMovingImage(img_b)
itk_filter.SetParameterMap(parameterMap)
itk_filter.Execute()

result_vol = sitk.GetArrayFromImage(itk_filter.GetResultImage())

np.max(np.abs(vol1 - result_vol))

Код из примера 2d:

vol1 = np.zeros((50, 50))
for x in range(vol1.shape[0]):
    for y in range(vol1.shape[1]):
        vol1[x, y] = np.linalg.norm(np.subtract([x, y], [20, 20])) < 4

vol2 = np.zeros((50, 50))
for x in range(vol2.shape[0]):
    for y in range(vol2.shape[1]):
        vol2[x, y] = np.linalg.norm(np.subtract([x, y], [4, 5])) < 4

img_a = sitk.GetImageFromArray(vol1)
img_b = sitk.GetImageFromArray(vol2)

parameterMap = sitk.GetDefaultParameterMap('translation')

itk_filter = sitk.ElastixImageFilter()
itk_filter.LogToConsoleOn()
itk_filter.SetFixedImage(img_a)
itk_filter.SetMovingImage(img_b)
itk_filter.SetParameterMap(parameterMap)
itk_filter.Execute()

result_vol = sitk.GetArrayFromImage(itk_filter.GetResultImage())

np.max(np.abs(vol1 - result_vol))

1 Ответ

0 голосов
/ 29 января 2019

Возможно, регистрация не удалась, потому что сферы не перекрываются. Вы можете попытаться сгладить изображения немного больше, например, sitk.DiscreteGaussian(). Однако в этом искусственном примере весьма вероятно, что простое перемещение сфер ближе друг к другу приведет к хорошей регистрации.

Обратите внимание, что трудно регистрировать двоичные изображения, так как в изображениях такого типа очень мало информации о градиенте: градиенты ненулевые только на границе, и нулевые везде, потому что области имеют плоскую интенсивность.

...